2012-03-22 112 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