Como posso obter a posição do cursor de dentro de um campo de entrada?
Encontrei alguns pedaços no Google, mas nada à prova de balas.
Basicamente, algo como um plugin jQuery seria ideal, então eu poderia simplesmente fazer
$("#myinput").caretPosition()
javascript
jquery
html
MarkB29
fonte
fonte
<input>
maneira é muito mais simples do que fazê-lo em uma<textarea>
.size
caracteres passados .Respostas:
Atualização mais fácil:
Use o
field.selectionStart
exemplo nesta resposta .Obrigado a @commonSenseCode por apontar isso.
Resposta antiga:
Encontrei esta solução. Não é baseado em jquery, mas não há problema em integrá-lo ao jquery:
fonte
else if (oField.selectionStart || oField.selectionStart == '0')
pode serelse if (typeof oField.selectionStart==='number')
document.selection
, nãofield.selection
ou algo assim. Além disso, no IE 7 foi possível (não sei se ainda é possível no 8+) selecionar algo e, em seguida, TAB fora do campo sem perder a seleção. Dessa forma, quando o texto é selecionado, mas o campo não está focado,document.selection
retorna a seleção zero. É por isso que, como solução alternativa para esse bug, você precisa se concentrar no elemento antes de ler odocument.selection
.Agradável, muito obrigado a Max.
Embrulhei a funcionalidade em sua resposta no jQuery, se alguém quiser usá-lo.
fonte
input = $(this).get(0)
o mesmo queinput = this
?this
refere-se a um conjunto completo agrupado. Seu código ainda está errado, deveria ser apenasthis.get(0)
. Seu código provavelmente ainda funcionou porque o novo agrupamento de um conjunto agrupado não faz nada.MUITO FÁCIL
Resposta atualizada
Use
selectionStart
, é compatível com todos os principais navegadores .Atualização: Funciona apenas quando nenhum tipo está definido ou
type="text"
na entrada.fonte
.selectionStart
propriedade a qualquer momento (document.getElementById('foobar').selectionStart
), pois ela não precisa estar dentro de um ouvinte de evento.Tem uma solução muito simples . Experimente o seguinte código com resultado verificado -
Estou te dando o fiddle_demo
fonte
slice
é uma operação relativamente cara e não acrescenta nada a essa 'solução' -el.selectionStart
é equivalente ao comprimento da sua fatia; apenas devolva isso. Além disso, a razão pela qual as outras soluções são mais complicadas é porque elas lidam com outros navegadores que não suportamselectionStart
.f1
é tão significativo quanto 'user2782001'. 😉Agora existe um bom plugin para isso: O Caret Plugin
Em seguida, você pode obter a posição usando
$("#myTextBox").caret()
ou configurá-la via$("#myTextBox").caret(position)
fonte
fonte
Há algumas boas respostas postadas aqui, mas acho que você pode simplificar seu código e pular a verificação de
inputElement.selectionStart
suporte: ele não é suportado apenas no IE8 e versões anteriores (consulte a documentação ), que representa menos de 1% do uso atual do navegador .fonte
Talvez você precise de um intervalo selecionado além da posição do cursor. Aqui está uma função simples, você nem precisa do jQuery:
Digamos que você queira chamá-lo em uma entrada sempre que ele mudar ou o mouse mover a posição do cursor (neste caso, estamos usando o jQuery
.on()
). Por motivos de desempenho, pode ser uma boa ideia adicionarsetTimeout()
ou algo como Sublinhados_debounce()
se os eventos estiverem chegando:Aqui está um violino, se você quiser experimentá-lo: https://jsfiddle.net/Dhaupin/91189tq7/
fonte
fonte