Как я могу получить позицию каретки из поля ввода?
Я нашел несколько кусочков через Google, но ничего не доказательство.
В принципе что-то вроде плагина jQuery было бы идеальным, поэтому я мог бы просто сделать
$("#myinput").caretPosition()
javascript
jquery
html
MarkB29
источник
источник
<input>
намного проще, чем в a<textarea>
.size
символы.Ответы:
Более простое обновление:
Используйте
field.selectionStart
пример в этом ответе .Спасибо @commonSenseCode за указание на это.
Старый ответ:
Нашел это решение. Не на основе jquery, но нет проблем с его интеграцией в jquery:
источник
else if (oField.selectionStart || oField.selectionStart == '0')
может бытьelse if (typeof oField.selectionStart==='number')
document.selection
неfield.selection
или что - то. Кроме того, в IE 7 было возможно (не знаю, возможно ли это в 8+) выбрать что-то, а затем нажать TAB, не теряя выбора. Таким образом, когда текст выделен, но поле не сфокусировано,document.selection
возвращается нулевое выделение. Вот почему, в качестве обходного пути для этой ошибки, вы должны сосредоточиться на элементе, прежде чем читатьdocument.selection
.Хороший, большое спасибо Максу.
Я включил функциональность его ответа в jQuery, если кто-то захочет его использовать.
источник
input = $(this).get(0)
же, какinput = this
?this
подразумевается полный упакованный набор. Его код все еще неверен, хотя, так и должно бытьthis.get(0)
. Его код, вероятно, все еще работал, потому что переупаковка упакованного набора ничего не делает.ОЧЕНЬ ПРОСТО
Обновленный ответ
Используйте
selectionStart
его, он совместим со всеми основными браузерами .Обновление: это работает только тогда, когда тип не определен или
type="text"
на входе.источник
.selectionStart
свойство в любое время (document.getElementById('foobar').selectionStart
), оно не обязательно должно быть внутри прослушивателя событий.Получил очень простое решение . Попробуйте следующий код с подтвержденным результатом -
Я даю тебе fiddle_demo
источник
slice
это относительно дорогая операция, и она ничего не добавляет к этому «решению» -el.selectionStart
эквивалентна длине вашего среза; просто верни это. Более того, причина, по которой другие решения являются более сложными, заключается в том, что они работают с другими браузерами, которые не поддерживаютselectionStart
.f1
примерно такой же значимый, как 'user2782001'. MichaelТеперь для этого есть хороший плагин: The Caret Plugin
Затем вы можете получить позицию, используя
$("#myTextBox").caret()
или установить ее через$("#myTextBox").caret(position)
источник
источник
Здесь опубликовано несколько хороших ответов, но я думаю, что вы можете упростить свой код и пропустить проверку на
inputElement.selectionStart
поддержку: он не поддерживается только в IE8 и более ранних версиях (см. Документацию ), что составляет менее 1% от текущего использования браузера .источник
Возможно, вам нужен выбранный диапазон в дополнение к позиции курсора. Вот простая функция, вам даже не нужен jQuery:
Допустим, вы хотите вызывать его на входе всякий раз, когда он изменяется или мышь перемещает позицию курсора (в этом случае мы используем jQuery
.on()
). По соображениям производительности, может быть хорошей идеей добавитьsetTimeout()
или что-то вроде Underscores,_debounce()
если текут события:Вот скрипка, если вы хотите попробовать это: https://jsfiddle.net/Dhaupin/91189tq7/
источник
источник