Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№125-06-2011 08:10:42

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Получение координат курсора (caret) в input field

Для закрепления tooltip anchor требуется получить координаты курсора (в данном случае именно caret, т.е. курсора текстового поля, а не cursor, т.е. курсора мыши) в поле ввода. Именно XY-координаты на экране, а не симовльную позицию курсора в поле. Метод, где требуется получить координаты - обработчик focus event, т.е. в событии не содержится информации о координатах. Использовать mouse event (где информация о координатах есть) вместо focus event не получится, т.к. фокус может быть передан программно, или клавиатурным вводом. Была идея сделать это посредством winapi-функции GetCaretPos (в расширении и без этого достаточно много winapi-вызовов, и в отношении кроссплатформенности ему терять уже нечего), но не тут-то было - видимо, из-за нюансов отрисовки xul-интерфейса процесс FF блокирует вызовы указанной функции, и она всегда возвращает нулевые координаты (проблема эта достаточно старая, и известна не только мне). Других идей на предмет получения требуемого у меня нет, в гугле/mozillazine/MDN я тоже ничего не нашел, но, надеюсь, я все же чего-то не учел, или просто чего-то не знаю касательно вопроса темы.

Отсутствует

 

№225-06-2011 22:53:08

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 5.0

Re: Получение координат курсора (caret) в input field

Вот такое работает из консоли ошибок:

Выделить код

Код:

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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№326-06-2011 03:59:57

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: Получение координат курсора (caret) в input field

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 - пришлось получать его вышеописанным способом).
Сейчас мне просто хотелось бы знать, могут ли быть какие-то последствия от

Выделить код

Код:

focusedElement.setAttribute("contentEditable","true");
Infocatcher пишет

Но это относительные координаты, так что потом нужно еще что-то вроде этого.

Меня относительные координаты вполне устраивают - мне как раз нужно смещение относительно координат самого элемента для определения смещений, задаваемых в вызове tooltip.openPopup.

Добавлено 26-06-2011 04:03:47
Да, вышеизложенный прием с получением editor все равно не помог в случае xul:textbox с multiline="true". В чем тут дело - я так пока и не разобрался.

Отредактировано hydrolizer (26-06-2011 04:05:00)

Отсутствует

 

№426-06-2011 11:22:38

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: Получение координат курсора (caret) в input field

Поэкспериментировал с nsIEditor - получается, что если его нет сразу, то получать его описанным мной выше способом нет никакого смысла - у него, например, selection.getRangeAt() возвращает Range, у которого нулевой ClientRect - равны нулю top,bottom. left, right. Проверял на страничке создания нового письма в гуглопочте. Получается, если editor есть (что бывает далеко не всегда), то его можно использовать, а если нет - то нет, и придется обойтись привязкой непосредственно к элементу без всяких смещений.

Отсутствует

 

№526-06-2011 20:26:19

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 5.0

Re: Получение координат курсора (caret) в input field

hydrolizer пишет

Поэкспериментировал с nsIEditor - получается, что если его нет сразу...

А если сделать что-то вроде этого?


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№627-06-2011 18:58:42

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: Получение координат курсора (caret) в input field

Infocatcher
Ага, спасибо. Это именно то, что нужно. Теперь всё работает. Была единственная небольшая проблема с вариантом, когда у нас многострочное поле ввода - при передачи фокуса в крайнюю правую позицию строки выдавался все тот же нулевой ClientRect - потому, что range.endContainer попадал на HTMLBRElement, а range.commonAncestorContainer указывал на всё поле в целом. Решилось разбором range по нодам от endContainer до первой ноды с ненулевым ClientRect.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]