Qual é a melhor maneira (e presumo a maneira mais simples) de colocar o cursor no final do texto em um elemento de texto de entrada via JavaScript - após o foco ter sido definido para o elemento?
javascript
Amendoim
fonte
fonte
Existe uma maneira simples de fazê-lo funcionar na maioria dos navegadores.
No entanto, devido às peculiaridades * de alguns navegadores, uma resposta mais abrangente se parece mais com esta
Usando jQuery (para definir o ouvinte, mas não é necessário caso contrário)
Mostrar snippet de código
Usando o Vanilla JS (
addEvent
função de empréstimo desta resposta )Mostrar snippet de código
Peculiaridades
O Chrome possui uma peculiaridade ímpar, na qual o evento de foco é acionado antes que o cursor seja movido para o campo; que estraga minha solução simples. Duas opções para corrigir isso:
focus
paramouseup
. Isso seria muito chato para o usuário, a menos que você ainda acompanhasse o foco. Eu realmente não estou apaixonado por nenhuma dessas opções.Além disso, @vladkras apontou que algumas versões mais antigas do Opera calculam incorretamente o comprimento quando há espaços. Para isso, você pode usar um número enorme que deve ser maior que sua string.
fonte
this.selectionStart = this.selectionEnd = 0;
isso deve mover o foco antes da primeira letra da caixa de entrada. Mas, quando depurei, nem mudava o valor de selectionEnd e selectionStart! E também não movê-lo para o primeiro personagem !!selectionStart
elength
retornando um número menor nos espaços. É por isso que eu uso10000
ou qualquer outro número grande o suficiente, em vez dethis.value.length
(testado no IE8 e IE11)Tente isso, funcionou para mim:
Para que o cursor seja movido para o final, a entrada deve ter o foco primeiro e, quando o valor for alterado, ele será finalizado. Se você definir .value para o mesmo, não será alterado no chrome.
fonte
this.
na frente da entrada nas linhas 2, 3 e 4? Já sabemos que esseinput
é o elemento de entrada. O usothis
parece redundante. Boa solução caso contrário!$input.focus().val($input.val());
Depois de mexer um pouco com isso, achei a melhor maneira de usar a
setSelectionRange
função se o navegador suportar; caso contrário, volte a usar o método na resposta de Mike Berrow (ou seja, substitua o valor por ele mesmo).Também estou definindo
scrollTop
um valor alto no caso de estarmos em uma rolagem verticaltextarea
. (Usar um valor alto arbitrário parece mais confiável do que$(this).height()
no Firefox e Chrome.)Eu fiz isso como um plugin jQuery. (Se você não estiver usando o jQuery, confio em que você ainda consiga entender o conteúdo com facilidade).
Eu testei no IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.
Está disponível no jquery.com como o plug-in PutCursorAtEnd . Para sua conveniência, o código da versão 1.0 é o seguinte:
fonte
Essa função funciona para mim no IE9, Firefox 6.xe Opera 11.x
fonte
SCRIPT16389: Unspecified error.
Eu tentei o seguinte com muito sucesso no chrome
Resumo rápido:
Ele pega todos os campos de entrada com o foco da classe e, em seguida, armazena o valor antigo do campo de entrada em uma variável, depois aplica a string vazia ao campo de entrada.
Então ele espera 1 milissegundo e coloca o valor antigo novamente.
fonte
É 2019 e nenhum dos métodos acima funcionou para mim, mas este funcionou, retirado de https://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/
fonte
el.focus()
no,else if
então não estava funcionando em alguns casos. Eu verifiquei que isso funciona agora no chrome e no (shudder) IESimples. Ao editar ou alterar valores, primeiro coloque o foco e depois defina o valor.
fonte
Ainda é necessária a variável intermediária (veja var val =), caso contrário o cursor se comporta de forma estranha, precisamos dela no final.
fonte
el.setSelectionRange(-1, -1);
https://codesandbox.io/s/peaceful-bash-x2mti
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
Em outros métodos js,
-1
geralmente significa (para o) último caractere. Esse também é o caso deste, mas não consegui encontrar menção explícita desse comportamento nos documentos.fonte
Para todos os navegadores para todos os casos:
Tempo limite necessário se você precisar mover o cursor do manipulador de eventos onFocus
fonte
Gosto muito da resposta aceita, mas ela parou de funcionar no Chrome. No Chrome, para que o cursor chegue ao fim, o valor de entrada precisa ser alterado. A solução é a seguinte:
fonte
No jQuery, isso é
fonte
Esse problema é interessante. A coisa mais confusa é que nenhuma solução que encontrei resolveu o problema completamente.
+++++++ SOLUÇÃO +++++++
Você precisa de uma função JS, assim:
Você precisa ligar para esse cara nos eventos onfocus e onclick.
FUNCIONA EM TODOS OS DISPOSITIVOS E NAVEGADORES !!!!
fonte
Acabei de descobrir que, no iOS, a
textarea.textContent
propriedade de configuração colocará o cursor no final do texto no elemento textarea toda vez. O comportamento foi um bug no meu aplicativo, mas parece ser algo que você pode usar intencionalmente.fonte
fonte
Tomando algumas das respostas .. Criando um jquery de linha única.
fonte
Se o campo de entrada precisar apenas de um valor padrão estático, normalmente faço isso com o jQuery:
Isso parece funcionar em todos os navegadores.
fonte
Embora essa possa ser uma pergunta antiga com muitas respostas, deparei-me com um problema semelhante e nenhuma das respostas era exatamente o que eu queria e / ou foi mal explicada. O problema com as propriedades selectionStart e selectionEnd é que elas não existem para o número do tipo de entrada (enquanto a pergunta foi feita para o tipo de texto, acho que isso pode ajudar outras pessoas que possam ter outros tipos de entrada que precisam focar). Portanto, se você não souber se o tipo de entrada que a função focalizará é um número de tipo ou não, não poderá usar essa solução.
A solução que funciona em vários navegadores e para todos os tipos de entrada é bastante simples:
Dessa forma, o cursor está no final do elemento de entrada.
Então, tudo o que você faria é algo assim (usando jquery, desde que o seletor de elemento que se deseja focar seja acessível por meio do atributo de dados 'elemento de foco de dados' do elemento clicado e a função seja executada após clicar em '.foo' elemento):
Por que isso funciona? Simplesmente, quando o .focus () é chamado, o foco será adicionado ao início do elemento de entrada (que é o principal problema aqui), ignorando o fato de que o elemento de entrada já possui um valor. No entanto, quando o valor de uma entrada é alterado, o cursor é automaticamente colocado no final do valor dentro do elemento de entrada. Portanto, se você substituir o valor pelo mesmo valor que foi inserido anteriormente na entrada, o valor parecerá intocado, o cursor, no entanto, será movido para o final.
fonte
Experimente este funciona com Vanilla JavaScript.
Em Js
fonte
Coloque o cursor quando clicar na área de texto no final do texto ... A variação deste código é ... TAMBÉM funciona! para Firefox, IE, Safari, Chrome ..
No código do servidor:
Em Javascript:
fonte
Se você definir o valor primeiro e depois o foco, o cursor sempre aparecerá no final.
Aqui está o violino para testar https://jsfiddle.net/5on50caf/1/
fonte
Eu queria colocar o cursor no final de um elemento "div" em que contenteditable = true e obtive uma solução com o código Xeoncross :
E essa função faz mágica:
Funciona bem para a maioria dos navegadores, verifique, este código coloca o texto e coloca o foco no final do texto no elemento div (não no elemento de entrada)
https://jsfiddle.net/Xeoncross/4tUDk/
Obrigado, Xeoncross
fonte
Eu também enfrentei o mesmo problema. Finalmente isso vai funcionar para mim:
É assim que podemos chamar isso:
Funciona para mim no safari, IE, Chrome, Mozilla. Em dispositivos móveis, não tentei isso.
fonte
Verifique esta solução!
fonte
Super fácil (talvez você precise se concentrar no elemento de entrada)
fonte
Eu tentei as sugestões antes, mas nenhuma funcionou para mim (as testei no Chrome), então escrevi meu próprio código - e funciona bem no Firefox, IE, Safari, Chrome ...
Na área de texto:
Em Javascript:
fonte
Aqui está uma demonstração do jsFiddle da minha resposta. A demonstração usa o CoffeeScript, mas você pode convertê-lo em JavaScript simples, se necessário.
A parte importante, em JavaScript:
Estou postando esta resposta porque já a escrevi para outra pessoa que teve a mesma pergunta. Essa resposta não cobre tantos casos extremos quanto as principais respostas aqui, mas funciona para mim e tem uma demonstração do jsFiddle com a qual você pode brincar.
Aqui está o código do jsFiddle, portanto, essa resposta é preservada mesmo se o jsFiddle desaparecer:
fonte
Tente o seguinte código:
fonte
setSelectionRange
abordagem é certamente muito mais eficiente quando / onde é suportada.Embora eu esteja respondendo tarde demais, mas para consultas futuras, será útil. E também funciona em
contenteditable
div.De onde você precisa definir o foco no final; escreva este código
E a função é -
fonte