>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Получение координат курсора (caret) в input field http://forum.mozilla-russia.org/viewtopic.php?id=50370 |
hydrolizer > 25-06-2011 08:10:42 |
Для закрепления tooltip anchor требуется получить координаты курсора (в данном случае именно caret, т.е. курсора текстового поля, а не cursor, т.е. курсора мыши) в поле ввода. Именно XY-координаты на экране, а не симовльную позицию курсора в поле. Метод, где требуется получить координаты - обработчик focus event, т.е. в событии не содержится информации о координатах. Использовать mouse event (где информация о координатах есть) вместо focus event не получится, т.к. фокус может быть передан программно, или клавиатурным вводом. Была идея сделать это посредством winapi-функции GetCaretPos (в расширении и без этого достаточно много winapi-вызовов, и в отношении кроссплатформенности ему терять уже нечего), но не тут-то было - видимо, из-за нюансов отрисовки xul-интерфейса процесс FF блокирует вызовы указанной функции, и она всегда возвращает нулевые координаты (проблема эта достаточно старая, и известна не только мне). Других идей на предмет получения требуемого у меня нет, в гугле/mozillazine/MDN я тоже ничего не нашел, но, надеюсь, я все же чего-то не учел, или просто чего-то не знаю касательно вопроса темы. |
Infocatcher > 25-06-2011 22:53:08 |
Вот такое работает из консоли ошибок: Выделить код Код:top.opener.document.commandDispatcher.focusedElement.editor.selection.getRangeAt(0).getBoundingClientRect().left; И это только для Firefox 4 и новее. 25-06-2011 22:55:12 |
hydrolizer > 26-06-2011 03:59:57 |
Infocatcher
поэтому для полей, у которых editor отсутствует, я сделал так: Выделить код Код:var controller = currDoc.commandDispatcher.getControllerForCommand("cmd_insertText"); if (!(controller && controller.isCommandEnabled("cmd_insertText"))) return; focusedElement.setAttribute("contentEditable","true"); var win=focusedElement.ownerDocument.defaultView; var editingSession = win.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIEditingSession); editor=editingSession.getEditorForWindow(win); (при попытке получения editor напрямую все равно получаю undefined - пришлось получать его вышеописанным способом). Infocatcher пишет
Меня относительные координаты вполне устраивают - мне как раз нужно смещение относительно координат самого элемента для определения смещений, задаваемых в вызове tooltip.openPopup. 26-06-2011 04:03:47 |
hydrolizer > 26-06-2011 11:22:38 |
Поэкспериментировал с nsIEditor - получается, что если его нет сразу, то получать его описанным мной выше способом нет никакого смысла - у него, например, selection.getRangeAt() возвращает Range, у которого нулевой ClientRect - равны нулю top,bottom. left, right. Проверял на страничке создания нового письма в гуглопочте. Получается, если editor есть (что бывает далеко не всегда), то его можно использовать, а если нет - то нет, и придется обойтись привязкой непосредственно к элементу без всяких смещений. |
Infocatcher > 26-06-2011 20:26:19 |
hydrolizer пишет
А если сделать что-то вроде этого? |
hydrolizer > 27-06-2011 18:58:42 |
Infocatcher |