Estou usando esse código para tentar selecionar todo o texto no campo quando um usuário se concentra no campo. O que acontece é que ele seleciona tudo por um segundo, depois é desmarcado e o cursor de digitação é deixado onde eu cliquei ...
$("input[type=text]").focus(function() {
$(this).select();
});
Quero que tudo permaneça selecionado.
Respostas:
Tente usar em
click
vez defocus
. Parece funcionar para eventos importantes e do mouse (pelo menos no Chrome / Mac):jQuery <versão 1.7:
jQuery versão 1.7+:
Aqui está uma demonstração
fonte
Eu acho que o que acontece é o seguinte:
Uma solução alternativa pode estar chamando o select () de forma assíncrona, para que seja executado completamente após o focus ():
fonte
this
é um pouco inesperado em tais âmbitos. Vou atualizar o código.Eu acho que essa é a melhor solução. Ao contrário de simplesmente selecionar no evento onclick, ele não impede a seleção / edição de texto com o mouse. Ele funciona com os principais mecanismos de renderização, incluindo o IE8.
http://jsfiddle.net/25Mab/9/
fonte
select()
parece funcionar.$('input[autofocus]').select();
Há algumas respostas decentes aqui e @ user2072367 é a minha favorita, mas ele tem um resultado inesperado quando você se concentra na guia e não no clique. (resultado inesperado: para selecionar texto normalmente após o foco na guia, você deve clicar uma vez mais)
Esse violão corrige esse pequeno erro e armazena adicionalmente $ (this) em uma variável para evitar a seleção redundante do DOM. Confira! (:
Testado no IE> 8
fonte
Após uma análise cuidadosa, proponho isso como uma solução muito mais limpa dentro deste segmento:
Demonstração em jsFiddle
O problema:
Aqui está um pouco de explicação:
Primeiro, vamos dar uma olhada na ordem dos eventos quando você passa o mouse ou guia em um campo.
Podemos registrar todos os eventos relevantes como este:
Alguns navegadores tentam posicionar o cursor durante os eventos
mouseup
ouclick
. Isso faz sentido, pois você pode querer iniciar o cursor em uma posição e arrastar para destacar algum texto. Não pode fazer uma designação sobre a posição do cursor até que você realmente tenha levantado o mouse. Portanto, as funções que lidam com ofocus
destino estão fadadas a responder muito cedo, deixando o navegador substituir o seu posicionamento.Mas o problema é que realmente queremos lidar com o evento de foco. Ele nos informa a primeira vez que alguém entra no campo. Após esse ponto, não queremos continuar substituindo o comportamento de seleção do usuário.
A solução:
Em vez disso, dentro do
focus
manipulador de eventos, podemos anexar rapidamente ouvintes para os eventosclick
(clique) ekeyup
(tab in) que estão prestes a disparar.Queremos apenas disparar o evento uma vez. Poderíamos usar
.one("click keyup)
, mas isso chamaria o manipulador de eventos uma vez para cada tipo de evento . Em vez disso, assim que pressionar o mouse ou a tecla, chamaremos nossa função. A primeira coisa que faremos é remover os manipuladores de ambos. Dessa forma, não importa se inserimos ou inserimos o mouse. A função deve ser executada exatamente uma vez.Agora, podemos ligar
select()
depois que o navegador fizer sua seleção, para substituir o comportamento padrão.Finalmente, para proteção extra, podemos adicionar espaços de nomes de eventos às funções
mouseup
ekeyup
para que o.off()
método não remova outros ouvintes que possam estar em jogo.Testado no IE 10+, FF 28+ e Chrome 35+
Como alternativa, se você deseja estender o jQuery com uma função chamada
once
que será acionada exatamente uma vez para qualquer número de eventos :Em seguida, você pode simplificar ainda mais o código assim:
Demonstração em violino
fonte
click
evento que está mais abaixo do que no pipelinemouseup
. Como queremos lidar com o final da seleção o mais tarde possível para nos dar a maior chance de substituir o navegador, usar o clique em vez da mouse deve fazer o truque. Testado em FF, Chrome e IE.one
não o cortará como "O manipulador é executado uma vez por elemento por tipo de evento . Ele desativará automaticamente o evento que o disparou, mas o outro ainda estará por aí eoff
cuida de ambos. Veja meu pergunta: função que irá disparar apenas uma vez para qualquer número de eventosIsso faria o trabalho e evitaria o problema de que você não pode mais selecionar parte do texto com o mouse.
fonte
Esta versão funciona no ios e também corrige o arrastar-para-selecionar padrão no windows chrome
http://jsfiddle.net/Zx2sc/2/
fonte
O problema com a maioria dessas soluções é que elas não funcionam corretamente ao alterar a posição do cursor no campo de entrada.
O
onmouseup
evento altera a posição do cursor no campo, que é acionado depoisonfocus
(pelo menos no Chrome e FF). Se você descartar incondicionalmente omouseup
, o usuário não poderá alterar a posição do cursor com o mouse.O código impedirá condicionalmente o
mouseup
comportamento padrão se o campo não tiver foco no momento. Funciona para estes casos:Eu testei isso no Chrome 31, FF 26 e IE 11.
fonte
Encontrei uma solução incrível lendo este tópico
fonte
Eu venho do final de 2016 e esse código funciona nas versões recentes do jquery (jquery-2.1.3.js nesse caso).
fonte
Eu usando o FF 16.0.2 e jquery 1.8.3, todo o código na resposta não funcionou.
Eu uso código como este e trabalho.
fonte
$("input[type=text]").on('click', function () { $(this).focus.select(); })
está causando o foco e a seleção quando o usuário clica na caixa, porque é executado quando o usuário clica na caixa. Sem o manipulador de eventos, o código não responde à pergunta, portanto, o voto negativo e o comentário. Basicamente, você tem a parte "todo o texto atual está selecionado", mas não a parte "quando ele seleciona o campo".Use clearTimeout para obter mais segurança se você alternar rapidamente entre duas entradas. ClearTimeout limpa o tempo limite antigo ...
fonte
Funciona muito bem com o JavaScript nativo
select()
.ou em geral:
fonte
Ou você pode simplesmente usar o
<input onclick="select()">
Works perfect.fonte
Você pode usar um código simples:
fonte
fonte
$.ready
não está correto. Você precisa passar uma função para atrasarattr
até que o documento esteja pronto. Você está fazendo isso imediatamente e passando a coleção de elementos para$.ready
.addEventListener
.Eu sempre uso
requestAnimationFrame()
para pular mecanismos internos pós-evento e isso funciona perfeitamente no Firefox. Não testou no Chrome.fonte