所以我有一个方法,它接受一个标记并包装该标记中的选定文本。
function wrap(tag)
{
var sel, range;
if (window.getSelection)
{
sel = window.getSelection();
if (sel.rangeCount)
{
range = sel.getRangeAt(0);
var selectedText = range.toString();
range.deleteContents();
range.insertNode(document.createTextNode('['+tag+']'+selectedText+'[/'+tag+']'));
}
}
}
然而,这个问题是在完成包装文本并插入节点之后,在插入的文本之前放置了插入符号(它们正在键入的位置)。
是否有这样的方法来插入文本并将插入符号保留在其末尾?
请注意,如果不使用jQuery或任何其他库,可以这样做。我只需要它在webkit(Safari)中工作。
答案 0 :(得分:20)
您可以使用range.setStartAfter和range.setEndAfter方法将起点和终点设置为直接在新节点之后的点。我在这里设置了一个jsfiddle示例:http://jsfiddle.net/phil_mcc/tM3mA/
//move the caret
range.setStartAfter(newNode);
range.setEndAfter(newNode);
sel.removeAllRanges();
sel.addRange(range);
答案 1 :(得分:1)
将节点插入范围后执行此操作
range.collapse(false);
这会将选择范围的位置改变到范围的末尾,所以我的猜测是它应该将光标设置在结束位置