0

IE8 のデザイン モードで、iframe 内のテキストのキャレット位置を取得しようとしています。私が持っているコードは機能しますが、長いテキストの場合、すべてのテキストを選択してから一度に1文字ずつ範囲の終わりを移動し始めるため、パフォーマンスが悪く醜いです。

IE で現在のキャレット位置を取得するためのより高速でエレガントな方法があるのだろうか? ここに私の現在のコードがあります:

var r = doc.selection.createRange();
r.collapse(false);
doc.execCommand("SelectAll") //this is ugly..
var r2 = doc.selection.createRange();
r2.select();
//..and this is slow
while (r.compareEndPoints("EndToEnd", r2) < 0) {
   r2.moveEnd("character", -1)
   r2.select();
}
pos = r2.text.length;
4

1 に答える 1

3

はい、Rangyライブラリを使用できます。これは、 DOM Level 2 Rangeインターフェイスを使用して、すべてのブラウザーでこれを行う単一の方法を提供します。以下は、iframe のwindowオブジェクトが という変数に格納されていることを前提としていiframeWinます。

var sel = rangy.getSelection(iframeWin);
if (sel.rangeCount > 0) {
    var selectedRange = sel.getRangeAt(0);
    alert(selectedRange.toString());
}

IE のTextRangeオブジェクトを Rangy の DOM Range オブジェクトに変換するために使用されるプロセスは、既存のものよりも洗練されており、(少なくとも長いドキュメントの場合) はるかに高速です。興味がある場合は、関連するコードがこのファイルの上部にあります: http://code.google.com/p/rangy/source/browse/trunk/src/js/core/wrappedrange.js

于 2010-12-07T18:21:34.637 に答える