Как получить (x, y) пиксельные координаты каретки в текстовых полях? - PullRequest
28 голосов
/ 27 августа 2008

Я использую jQuery и пытаюсь найти кросс-браузерный способ получить пиксельные координаты каретки в полях <textarea> s и input, чтобы я мог разместить абсолютно позиционный div вокруг этого местоположения.

Есть ли плагин jQuery? Или фрагмент JavaScript для этого?

Ответы [ 3 ]

32 голосов
/ 17 марта 2014

Я искал плагин текстовых координат каретки для meteor-autocomplete , поэтому я оценил все 8 плагинов на GitHub. На сегодняшний день победителем является textarea-caret-position из Component .

Особенности

  • точность пикселей
  • никаких зависимостей вообще
  • совместимость с браузерами: Chrome, Safari, Firefox (несмотря на две ошибки у него есть), IE9 +; может работать, но не проверено в Opera, IE8 или более старых версиях
  • поддерживает любое семейство и размер шрифта, а также преобразование текста
  • область текста может иметь произвольные отступы или границы
  • не путается с горизонтальными или вертикальными полосами прокрутки в текстовой области
  • поддерживает жесткие возвраты, табуляции (кроме IE) и последовательные пробелы в тексте
  • правильная позиция в строках длиннее столбцов в текстовой области
  • нет позиция "призрак" в пустом пространстве в конце строки при переносе длинных слов

Вот демоверсия - http://jsfiddle.net/dandv/aFPA7/

enter image description here

Как это работает

Зеркало <div> создается вне экрана и стилизовано под <textarea>. Затем текст текстовой области до каретки копируется в div и сразу после него вставляется <span>. Затем текстовое содержимое диапазона устанавливается равным оставшемуся тексту в текстовой области, чтобы точно воспроизвести упаковку в поддельном div.

Это единственный метод, который гарантированно обрабатывает все крайние случаи, относящиеся к переносу длинных строк. Он также используется GitHub для определения позиции выпадающего списка пользователя @ .

1 голос
/ 27 августа 2008

Примечание: этот ответ описывает, как получить символьные координаты текстового курсора / каретки. Чтобы найти координаты пикселей, вам нужно расширить это.

Первое, что нужно запомнить, это то, что курсор может находиться в трех состояниях

  • обычный курсор вставки в определенной позиции
  • выделение текста с определенной ограниченной областью
  • не активен: текстовая область не имеет фокуса. Не был использован.

Модель IE использует объект document.selection , из которого мы можем получить объект TextRange , который дает нам доступ к выделению и, следовательно, к позиции курсора (ов).

Модель FF / Opera использует удобные переменные [input] .selectionStart и selectionEnd.

Обе модели представляют обычный курсор в виде выделения с нулевой шириной, а левая граница - это позиция курсора.

Если поле ввода не имеет фокуса, вы можете обнаружить, что ни один из них не установлен. Я успешно справился со следующим кодом для вставки фрагмента текста в текущую позицию курсора, а также замены текущего выделения, если оно есть. В зависимости от браузера, YMMV.

function insertAtCursor(myField, myValue) {

/* selecion model - ie */
if (document.selection) {
  myField.focus();
  sel = document.selection.createRange();
  sel.text = myValue;
}

/* field.selectionstart/end  firefox */ 
else if (myField.selectionStart || myField.selectionStart == '0' ) {

  var startPos = myField.selectionStart;
  var endPos = myField.selectionEnd;
  myField.value = myField.value.substring(0, startPos)
    + myValue
    + myField.value.substring(endPos, myField.value.length);

  myField.selectionStart = startPos + myValue.length;
  myField.selectionEnd = startPos + myValue.length;
  myField.focus();
} 

// cursor not active/present
else {
  myField.value += myValue;
}

Примечание об ошибке: ссылки не правильно помечены в верхнем абзаце.

Объект выделения: http://msdn.microsoft.com/en-us/library/ms535869(VS.85).aspx
Объект TextRange: http://msdn.microsoft.com/en-us/library/ms535872(VS.85).aspx

0 голосов
/ 27 августа 2008

Не думаю, что это можно сделать в любом браузере. Кто-то сделал это в IE6, но он не работает в FF или Opera (AFAIK). Может быть, вы можете заставить его работать во всех браузерах.

Вот сообщение в блоге за 2005 год .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...