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

+0

@phil mccull +1答えです。 「wrap」をクリックしたときに、そのdivにのみテキストを挿入し、ドキュメントの他の場所には挿入しないとどうなりますか? –

+0

はリンクから私の質問への答えを得ました:http://stackoverflow.com/a/8340432/1407434、更新されたfiddle:http://jsfiddle.net/tM3mA/38/ –

1

範囲にノード range.collapse(false); これは私の推測では、それが終了位置

+0

Nothing:/おそらく、範囲が削除されるという事実と関係しています。 – endy

関連する問題