2010-02-11 3 views
4

Я пытаюсь получить координату y курсора внутри contenteditable div, используя getBoundingClientRect(). Развертка IE кода работает, но другая ветвь (т. Е. Firefox 3.5 для моих текущих целей тестирования) не работает.проблема getBoundingClientRect с Firefox

В приведенном ниже коде содержатся проблематичные строки, отмеченные знаком «***». В этот момент кода оба selObj и selRange имеют значение (подтверждено в Firebug), но я не могу вызвать getBoundingClientRect() для любого из них (например, selObj.getBoundingClientRect не является функцией). Я прочитал, что getBoundingClientRect() теперь поддерживается Firefox в объекте Range, но я не могу заставить его работать. Думаю, я должен называть его неправильным типом объекта ...? Что я должен называть?

Следующий код является полным тестовым примером в виде файла html, содержащего соответствующий javascript. Просмотренный в IE, я получаю значение для координаты y курсора, но в Firefox он появляется.

<html> 
<head> 
<title>Test</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<style> 
#pageContainer { 
    padding:50px; 
} 
.pageCommon { 

    width: 100px; 
    height: 100px; 
    background-color:#ffffD0; 
    padding: 10px; 
    border: 1px solid black; 
    overflow: auto; 
} 


</style> 
</head> 
<body> 
<div id="pageContainer"> 
    <div id="editor" class="pageCommon" contenteditable onclick="setPageNav();" onkeypress="setPageNav();"> 

    </div> 
    <div>y: <span id="y"></span></div> 

</div> 
<script> 
var y; 

function setPageNav() { 

    page = document.getElementById("editor"); 
    if (window.getSelection) { 
      var selObj = window.getSelection(); 
      var selRange = selObj.getRangeAt(0); 
      // *** Neither of these next two lines work, error is : selObj.getBoundingClientRect is not a function 
      y = selObj.getBoundingClientRect().top; 
      y = selRange.getBoundingClientRect().top; 
    } else if (document.selection) { 
      var range = document.selection.createRange(); 
      y = range.getBoundingClientRect().top; 
    } 
    document.getElementById("y").innerHTML = y; 
} 

</script> 
</body> 
</html> 
+0

"Pops"? Можете ли вы объяснить, что это значит? Вызывает ли это исключение? – Pointy

+0

Да, извините, это то, что я имел в виду под «pops» – Tom

ответ

2

Я прочитал, что getBoundingClientRect() теперь поддерживается в Firefox на объекте Range

The support for that is new in Gecko 1.9.3 alpha, который будет включен в версию Firefox после 3.6.x. Firefox 3.5 не поддерживает его.

+0

Согласно MDC, это в Firefox 3 и выше: https://developer.mozilla.org/En/DOM/Element.getBoundingClientRect. Есть даже специальное примечание о реализации в FF 3.5 –

+1

@TJ Кроудер: «это» - элемент Element.getBoundingClientRect. Обратите внимание, что он отличается от Range.getBoundingClientRect, который является новым в Gecko 1.9.3, как я и в примечаниях к выпуску. – Nickolay

+0

Получил, спасибо. –

4

Я прочитал, что getBoundingClientRect() теперь поддерживается в Firefox на объекте Range

пока не это не так. Это функция Mozilla 1.9.3, которую вы можете ожидать в Firefox 3.7.

В любом случае вам понадобится откат, так как он не поддерживается никакими другими браузерами.

+1

MDC утверждает, что он находится в FF 3 и выше: https://developer.mozilla.org/En/DOM/Element.getBoundingClientRect Только что отмечен, и он отображается как функция в FF 3.6, Chrome и Safari. Насколько я не знаю, насколько это согласовано в этих различных реализациях. –

+1

Это метод 'Элемент'. Новая функция добавляет ту же способность к «Range». – bobince

+0

Получил, спасибо. –

Смежные вопросы