2012-03-22 108 views
9

所以我有一个方法需要一个标签并将选定的文本包装在该标签中。在插入节点后面插入插入符号

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)中工作。

回答

18

可以使用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

你是男人:) – endy 2012-03-23 03:22:59

+0

@phil mccull +1的答案。 如果您只需要在该div中插入文本而不在文档中的任何其他位置,单击'wrap'时会怎么样? – 2014-09-04 05:26:00

+0

从链接中得到了我的问题的答案:http://stackoverflow.com/a/8340432/1407434,更新的小提琴:http://jsfiddle.net/tM3mA/38/ – 2014-09-04 05:46:12

1

做到这一点的节点插入到范围 range.collapse(false); 这将改变选择范围的位置范围结束后,所以我的猜测是,应该设置光标在终点位置

+0

Nothing:/可能与范围被删除的事实有关。 – endy 2012-03-22 19:57:18