昨天有人问我这个事,今天就来做做了,最开始是按自己的思路做,在keyup事件里对输入键做判断,以处理什么退格啊,删除啊,上下左右移动等动作,然后记录光标位置来做文本处理,费了好大劲
。不过后来无意中发现了【孟子E章】的一个解决方案,简洁有效
。
本着研究学习的目的,我对【孟子E章】的方法做了个封装,这样在使用时会简单一些,尤其是需要插入的标签较多时。
这是调用代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<script type = "text/javascript" src = "JScript.js"></script>
<script type="text/javascript">

window.onload = function()

{
var ci = new CursorInsert();
ci.SetTargetTextControl(document.getElementById('txtContent'));
ci.SetSourceControl(document.getElementById('btnSource'), '[note]NOTE[/note]');
ci.Initialize();
}

</script>
</head>
<body>
<form id="form1" runat="server">
<textarea id = "txtContent" cols = "1" rows = "1" style = "width:500px;height:300px;"></textarea><br />
<input id = "btnSource" type = "button" value = "Click me" />
</form>
</body>
</html>
这是封装后的类:

var CursorInsert = function ()


{
this.targetTextControl = null;
this.sourceControls = new Array();
this.SetTargetTextControl = function(ctrl)

{
this.targetTextControl = ctrl;
}
this.SetSourceControl = function(ctrl,value)

{

this.sourceControls[this.sourceControls.length] =
{"Button" : ctrl , "Value" : value};
}
this.Initialize = function()

{
if (this.targetTextControl == null)

{
alert("Please set target text control first!");
return ;
}
if (this.sourceControls.length == 0)

{
alert("Please set source control first!");
return ;
}
this.SetText(this.targetTextControl);
for (var i = 0; i < this.sourceControls.length; i++)

{
this.SetButton(this.sourceControls[i].Button,this.sourceControls[i].Value,this.targetTextControl);
}
}
this.SetButton = function(btn,value,target)

{
var ctrl = target == null ? this.TextControl : target ;
btn.onclick = function()

{
CursorInsert.prototype.InsertAtCaret(target,value);
}
}
this.SetText = function(ctrl)

{
ctrl.onselect = function()

{
CursorInsert.prototype.SetCaret(this);
}
ctrl.onclick = function()

{
CursorInsert.prototype.SetCaret(this);
}
ctrl.onkeyup = function()

{
CursorInsert.prototype.SetCaret(this);
}
}
}

CursorInsert.prototype.SetCaret = function(textObj)


{
if (textObj.createTextRange)

{
textObj.caretPos = document.selection.createRange().duplicate();
}
}

CursorInsert.prototype.InsertAtCaret = function(textObj,value)


{
if(document.all)

{
if (textObj.createTextRange && textObj.caretPos)

{
var caretPos = textObj.caretPos;
caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? value + ' ' : value;
}
else

{
textObj.value = value;
}
}
else

{
if(textObj.setSelectionRange)

{
var rangeStart = textObj.selectionStart;
var rangeEnd = textObj.selectionEnd;
var tempStr1 = textObj.value.substring(0,rangeStart);
var tempStr2 = textObj.value.substring(rangeEnd);
textObj.value = tempStr1 + value + tempStr2;
}
else

{
alert("This version of Mozilla based browser does not support setSelectionRange!");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步