2010-12-07 6 views
0

IE8のデザインモードでiframe内のテキストのキャレット位置を取得しようとしています。 私は動作しているコードですが、長いテキストの場合、すべてのテキストを選択して一度に1文字ずつ範囲の終わりを移動し始めるため、ひどく醜い動作をします。IE:designModeのiframeにキャレットの位置を表示する方法はありますか?

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; 
+0

これは私が過去にどのようにしたかのようです。ごめんなさい。テキスト編集は悪夢です。 – mwilcox

+0

@mwilcox:私は悪夢を少なくするために多くの仕事をしました。私の答えを見てください。 –

答えて

3

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

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

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

+0

これは本当にクールです。これと最終的な将来の問題を一度に解決します。ありがとう。 – rodbv

+0

恐ろしいティム。もし私がその仕事をやり直す必要があれば、これを確かめるでしょう。 – mwilcox

関連する問題