2012-01-22 6 views
5

既知の親要素からユーザー選択の開始位置と終了位置を計算する方法を探しています。私はthisにいくつかのわずかな変更を加えて来ました。私はFFで働くことができましたが、私はIEでこれを行う方法がわかりません。私の修正が適切であれば、いくつかの考えを得たいと思っています。元の答えのためのTim Downへの大きな感謝。親要素からjavascriptを使用してユーザー選択の開始位置と終了位置を計算します。

function getBodyTextOffset(node, offset) { 
    var sel = window.getSelection(); 
    var range = document.createRange(); 
    range.selectNodeContents(document.getElementById('test')); 
    range.setEnd(node, offset); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
    return sel.toString().length; 
} 

function getSelectionOffsets() { 
    var sel, range; 
    var start = 0, end = 0; 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.rangeCount) { 
      range = sel.getRangeAt(sel.rangeCount - 1); 
      start = getBodyTextOffset(range.startContainer, range.startOffset); 
      end = getBodyTextOffset(range.endContainer, range.endOffset); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
      alert(start + ", " + end); 
     } 
    } else if (document.selection) { 
     // IE stuff here 
    } 
    return { 
     start: start, 
     end: end 
    }; 
} 

私はこれがしばらくされてなく、ここでの考え方を示すJSFiddleでいる知っています。 FFやChromeでは動作しますが、IE9では動作しません。理想的には、要素テストの最初からオフセットを取得できるようにしたいと考えています。ここではいくつかの良いリソースがあるものの

JavaScriptの範囲
+1

[jsfiddle](http://jsfiddle.net/)デモでは、良い回答を得るチャンスが大幅に向上します。 – c69

+0

[Rangy](http://code.google.com/p/rangy/)をご覧ください。現在のコードをきめ細かく翻訳できるかもしれません。 – Hemlock

答えて

1

が痛い話題です...ここで

http://dylanschiemann.com/articles/dom2Range/dom2RangeExamples.html

...しかし漠然としたまともな出発あなたがリファレンスとして使用することができますいくつかのデモですどのメソッドとプロパティが利用可能であるかを理解するためのポイント... http://help.dottoro.com/ljxsqnoi.php

次のJavaScriptを使用しているものを発見することができます。

for (i in window.getSelection()) {alert('i = '+i);} 

あなたはそれを追加することができます言及したオブジェクトが表示されたら、あなたはまた、メソッドのためにと、下記のようなまれパラメータに括弧を使用することを知っていることを確認してください...また

for (i in window.getSelection().getRangeAt(0)) {alert('i = '+i);} 

Geckoブラウザに非常に厄介なバグがあります(例: Firefox)Geckoが選択されていないにもかかわらず、Geckoが境界要素を間違ってその要素に設定している文字/文字の50%以下ではあるが、要素のわずかに外側にマウスを移動すると、 Mozillaが実際にそれを修正することを拒否していることは、例外的に厄介なことです(明らかに間違っている数多くのバグがあります)。

https://bugzilla.mozilla.org/show_bug.cgi?id=696571

うまくいけば、これは正しい方向に動くことを望みます。