Страницы: 1
Для закрепления tooltip anchor требуется получить координаты курсора (в данном случае именно caret, т.е. курсора текстового поля, а не cursor, т.е. курсора мыши) в поле ввода. Именно XY-координаты на экране, а не симовльную позицию курсора в поле. Метод, где требуется получить координаты - обработчик focus event, т.е. в событии не содержится информации о координатах. Использовать mouse event (где информация о координатах есть) вместо focus event не получится, т.к. фокус может быть передан программно, или клавиатурным вводом. Была идея сделать это посредством winapi-функции GetCaretPos (в расширении и без этого достаточно много winapi-вызовов, и в отношении кроссплатформенности ему терять уже нечего), но не тут-то было - видимо, из-за нюансов отрисовки xul-интерфейса процесс FF блокирует вызовы указанной функции, и она всегда возвращает нулевые координаты (проблема эта достаточно старая, и известна не только мне). Других идей на предмет получения требуемого у меня нет, в гугле/mozillazine/MDN я тоже ничего не нашел, но, надеюсь, я все же чего-то не учел, или просто чего-то не знаю касательно вопроса темы.
Отсутствует
Вот такое работает из консоли ошибок:
top.opener.document.commandDispatcher.focusedElement.editor.selection.getRangeAt(0).getBoundingClientRect().left;
И это только для Firefox 4 и новее.
Добавлено 25-06-2011 22:55:12
Но это относительные координаты, так что потом нужно еще что-то вроде этого.
Отредактировано Infocatcher (25-06-2011 22:55:12)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Спасибо, про editor я как-то не вспомнил. С ним есть одна проблема: он есть не у всех полей ввода, доступных для редактирования. Насколько я понимаю, наличие editor'a зависит от design mode документа, и так или иначе связано с функциональностью rich-text editing. В документации написано, что
Similarly, setting contentEditable to "true" allows you to make individual elements of a document editable
поэтому для полей, у которых 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 - пришлось получать его вышеописанным способом).
Сейчас мне просто хотелось бы знать, могут ли быть какие-то последствия от
Но это относительные координаты, так что потом нужно еще что-то вроде этого.
Меня относительные координаты вполне устраивают - мне как раз нужно смещение относительно координат самого элемента для определения смещений, задаваемых в вызове tooltip.openPopup.
Добавлено 26-06-2011 04:03:47
Да, вышеизложенный прием с получением editor все равно не помог в случае xul:textbox с multiline="true". В чем тут дело - я так пока и не разобрался.
Отредактировано hydrolizer (26-06-2011 04:05:00)
Отсутствует
Поэкспериментировал с nsIEditor - получается, что если его нет сразу, то получать его описанным мной выше способом нет никакого смысла - у него, например, selection.getRangeAt() возвращает Range, у которого нулевой ClientRect - равны нулю top,bottom. left, right. Проверял на страничке создания нового письма в гуглопочте. Получается, если editor есть (что бывает далеко не всегда), то его можно использовать, а если нет - то нет, и придется обойтись привязкой непосредственно к элементу без всяких смещений.
Отсутствует
Поэкспериментировал с nsIEditor - получается, что если его нет сразу...
А если сделать что-то вроде этого?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Ага, спасибо. Это именно то, что нужно. Теперь всё работает. Была единственная небольшая проблема с вариантом, когда у нас многострочное поле ввода - при передачи фокуса в крайнюю правую позицию строки выдавался все тот же нулевой ClientRect - потому, что range.endContainer попадал на HTMLBRElement, а range.commonAncestorContainer указывал на всё поле в целом. Решилось разбором range по нодам от endContainer до первой ноды с ненулевым ClientRect.
Отсутствует
Страницы: 1