利用js的selection操作,地址:https://developer.mozila.org/en-US/docs/Web/API/Selection
HTML代码:
<textarea class='showOptions_content'></textarea>
js代码:
var mousePlace = getCursortPosition(document.getElementsByClassName("showOptions_content")[0]);//获取光标的位置insertSpan(".showOptions_content",mousePlace,"测试数据");//重新给类名为showOptions_content的元素重新赋值
/**
* 插入指定元素到指定位置
* 参数:
* target:需要插入元素的目标id(在字符串前加#,例:"#showOptions")或者class类名(在字符串前加.例:".showOptions")
* placeNum:插入到元素的位置,
* contenTxt:需要插入的内容
* className:需要往目标元素中插入的元素的类名,数组(多个类名用)或者字符串(单个类名),可以不传
* **/
function insertSpan(target,placeNum,contenTxt) {
if($(target) && ($(target).length > 0)){
var tempValue = $(target).val().substr(placeNum);//临时存储条件框鼠标位置后面的值
/**
* 实现逻辑:将原来元素的值根据光标的位置后面的值截取出来,临时保存,
* 然后在将光标位置之间的值截取出来加上需要增加的值,然后将刚刚临时保存的
* 光标后面的元素加上,最后将这个加起来的值重新复制给内容框
* **/
var newValue = $(target).val().substr(0,placeNum).trim() + " " + contenTxt.trim() + " " + tempValue.trim();
$(target).val(newValue.trim());
setCaretPosition($(target)[0],placeNum + contenTxt.length + 1);
}else{
console.error("需要插入指值的目标元素不存在");
}
}
/**
* 获取光标位置
* 参数:
* ctrl:需要获取位置的元素(document.getElementById("p1"),document.getElementsByClassName("current")[0])
* 返回值:
* CaretPos:返回光标当前的位置
* **/
function getCursortPosition (ctrl) {
//获取光标位置函数
var CaretPos = 0;
// IE Support
if (document.selection)
{
ctrl.focus (); // 获取焦点
var Sel = document.selection.createRange (); // 创建选定区域
Sel.moveStart('character', -ctrl.value.length); // 移动开始点到最左边位置
CaretPos = Sel.text.length; // 获取当前选定区的文本内容长度
}
// Firefox,Chrome,edg support
else if (ctrl.selectionStart || (ctrl.selectionStart === '0'))
{
CaretPos =ctrl.selectionStart; // 获取选定区的开始点
}
return CaretPos;
}
// 设置光标位置
function setCaretPosition(ctrl, pos)
{
//设置光标位置函数
if(ctrl.setSelectionRange)
{
ctrl.focus(); // 获取焦点
ctrl.setSelectionRange(pos,pos); // 设置选定区的开始和结束点
}
else if (ctrl.createTextRange)
{
var range = ctrl.createTextRange(); // 创建选定区
range.collapse(true); // 设置为折叠,即光标起点和结束点重叠在一起
range.moveEnd('character', pos); // 移动结束点
range.moveStart('character', pos); // 移动开始点
range.select(); // 选定当前区域
}
}
上面给指定元素的位置插值,这个方法是根据别人的实例修改的,实例如下,因为这个示例是在目标元素内不断增加子元素,但是我的需求是往往某个元素中增加文字,比如往textarea标签中不断增加指定字符串,所以我根据下面的示例修改了一下。
// 插入指定元素到指定位置
<!doctype html>
<html>
<head>
<title>selection</title>
</head>
<body>
<p id="p1" contenteditable="true"><b>Hello</b> World</p>
<input type="button" value="insertSpan" οnclick="insertSpan()" />
</body>
<script>
function insertSpan() {
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
var oSpan = document.createElement("span");
oSpan.style.color = "red";
oSpan.appendChild(document.createTextNode("Inserted text"));
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.insertNode(oSpan);
}
</script>
</html>