TextRange
объекты действительно имеют свойства offsetLeft
и offsetTop
, но код, который вы разместили, выдаст ошибку в IE <9, потому что функция <code>getRangeObject() возвращает undefined
. Я бы предложил альтернативный код. Далее вы получите верхние левые координаты выделения относительно области просмотра в IE> = 4 и последних версиях других браузеров, которые поддерживают метод Range getBoundingClientRect()
, и вернут (0, 0) в других браузерах.
jsFiddle: http://jsfiddle.net/NkSmn/
Код:
function getSelectionTopLeft() {
var x = 0, y = 0;
// Use standards-based method only if Range has getBoundingClientRect
if (window.getSelection && document.createRange
&& typeof document.createRange().getBoundingClientRect != "undefined") {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var rect = sel.getRangeAt(0).getBoundingClientRect();
x = rect.left;
y = rect.top;
}
} else if (document.selection && document.selection.type != "Control") {
// All versions of IE
var textRange = document.selection.createRange();
x = textRange.boundingLeft;
y = textRange.boundingTop;
}
return { x: x, y: y };
}
Я работаю над модулем позиции Range / Selection для Rangy в данный момент, который использует подход, аналогичный описанному выше. Это незавершенная работа, но она работает довольно хорошо в большинстве сценариев и браузеров. Стоит сделать это в версии 1.3. Демо здесь: http://rangy.googlecode.com/svn/trunk/demos/position.html
Кроме того, этот код выглядит так, как будто он основан на коде из введения PPK к странице Ranges в режиме quirksmode. Он устарел, а код сбивает с толку и не идеален, но в ближайшем будущем он должен быть улучшен.