Как получить (x, y) пиксельные координаты каретки в текстовых полях?

Использовать целевой атрибут:

<a target="_parent" href="http://url.org">link</a>
28
задан Dan Dascalescu 17 March 2014 в 02:27
поделиться

3 ответа

Я искал плагин textarea координат каретки для meteor-autocomplete , поэтому я оценил все 8 плагинов на GitHub. Победителем, безусловно, является textarea-caret-position из Компонента .

Особенности

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

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

enter image description here

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

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

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

32
ответ дан Dan Dascalescu 17 March 2014 в 02:27
поделиться

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

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

0
ответ дан Dan Dascalescu 17 March 2014 в 02:27
поделиться

Примечание: этот ответ описывает, как добраться символьные координаты из text-cursor/caret. Для нахождения пиксельных координат необходимо будет расширить это далее.

первая вещь помнить состоит в том, что курсор может быть в трех состояниях

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

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

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

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

, Если поле ввода не фокусируется, можно найти, что ни один не установлен. Я имел хороший успех со следующим кодом для вставки части текста в текущей позиции курсора, также заменяя текущий выбор, если существующий. В зависимости от точного браузера, 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 (По сравнению с 85) объектом .aspx
TextRange: http://msdn.microsoft.com/en-us/library/ms535872 (По сравнению с 85) .aspx

1
ответ дан Cheekysoft 17 March 2014 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: