Получение offsetLeft текстового диапазона
Может кто-нибудь сказать мне, почему этот код возвращается undefined
,
Я надеялся, что это даст левую координату выбранного пользователем текста.
function alertRangeObject(){
var userSelection;
if(window.getSelection)
{
userSelection = window.getSelection();
}
else if (document.selection)
{
userSelection = document.selection.createRange();
}
var selectedText = userSelection;
if (userSelection.text)
{
selectedText = userSelection.text;
}
var rangeObject = getRangeObject(userSelection);
function getRangeObject(selectionObject)
{
if (selectionObject.getRangeAt)
return selectionObject.getRangeAt(0);
else { //safari
var range = document.createRange();
range.setStart(selectionObject.anchorNode, selectionObject.anchorOffset);
range.setEnd(SelectionObject.focusNode, selectionObject.focusOffset);
return range;
}
}
alert(rangeObject.offsetLeft);
}
Расстраивает то, когда вы alert(rangeObject)
Я получаю выделенный текст. Но я подумал, что если бы это был текстовый диапазон, я мог бы использовать offsetLeft
метод, чтобы получить левые координаты. Может ли кто-нибудь увидеть, что я делаю не так. Благодарю.
1 ответ
TextRange
объекты действительно имеют offsetLeft
а также offsetTop
свойств, но код, который вы разместили, приведет к ошибке в IE < 9, потому что getRangeObject()
функция возвращает undefined
, Я бы предложил альтернативный код. Далее вы получите верхние левые координаты выделения относительно области просмотра в IE >= 4 и последних версиях других браузеров, которые поддерживают getBoundingClientRect()
метод Range и возвращает (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. Он устарел, а код сбивает с толку и не идеален, но в ближайшем будущем он должен быть улучшен.