IE: есть ли быстрый способ получить позицию каретки в iframe в designMode? - PullRequest
0 голосов
/ 07 декабря 2010

Я пытаюсь получить позицию каретки для некоторого текста внутри iframe в режиме конструктора в IE8.У меня работает код, но для длинных текстов он работает плохо и безобразно, потому что он выделяет весь текст, а затем начинает перемещать конец диапазона по одному символу за раз.и более элегантный способ получить текущую позицию каретки в 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;

1 Ответ

3 голосов
/ 07 декабря 2010

Да, вы можете использовать мою библиотеку 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 в объекты DOM Range в Rangy, более сложный и значительнобыстрее (для длинных документов, по крайней мере), чем то, что у вас уже есть.Если вы заинтересованы, соответствующий код находится в верхней части этого файла: http://code.google.com/p/rangy/source/browse/trunk/src/js/core/wrappedrange.js

...