2010-12-18 15 views
3

この関数は、ユーザーが選択したテキストを返し、タグ(この場合は太字のタグ)でラップします。Javascript:DOM操作後の選択(ハイライト表示されたテキスト)を返します

function makeBold() { 
    var selection = window.getSelection(); 
    var range = selection.getRangeAt(0); 
    var newNode = document.createElement("b"); 
    range.surroundContents(newNode); 
} 



私は関数を呼び出した後、今、選択(強調表示されたテキスト)が削除されます。その選択を返すにはどうすればいいですか?あるいは、最初に選択を失うことなく関数を呼び出すにはどうすればよいですか?

+0

クロム/ Firefoxで動作します。どのブラウザを使用していますか? – SuperSaiyan

+0

@Thrustmaster:私はそれが動作しないとは言わなかったが、テキストは長く選択されている – Zebra

答えて

6

次のように動作します:

function makeBold() { 
    var selection = window.getSelection(); 
    if (selection.rangeCount) { 
     var range = selection.getRangeAt(0).cloneRange(); 
     var newNode = document.createElement("b"); 
     range.surroundContents(newNode); 
     selection.removeAllRanges(); 
     selection.addRange(range); 
    } 
} 

は、しかし、注意すべきいくつかの問題があります。

  • 範囲のsurroundContents()方法は、すべての範囲のために動作しません:それは内部に意味を作るために持っています新しいノード内のRangeコンテンツを囲むDOM。たとえば、2つの段落にまたがる範囲でsurroundContents()を使用しても、いずれかを完全に選択しないと、エラーが発生します。これの正式な定義については、DOM Level 2 Range specを参照してください。
  • バージョン8までのIEはDOM範囲をサポートしておらず、他のブラウザと全く異なるSelectionオブジェクトを持っています。 IE 9は他のブラウザと同様の範囲と選択機能を持っています。
  • 先に進む前に、選択のrangeCountプロパティをチェックする必要があります。そうしないと、選択がない場合に例外が発生します。
+0

うわー!機能と発言に感謝します。これは非常に役に立ちました。 – Zebra

関連する問題