Eu tenho uma entrada de texto. Quando a entrada recebe o foco, quero selecionar o texto dentro da entrada.
Com o jQuery, eu faria da seguinte maneira:
<input type="text" value="test" />
$("input[type=text]").click(function() {
$(this).select();
// would select "test" in this example
});
Eu procurei ao redor para tentar encontrar a maneira Angular, mas a maioria dos exemplos que estou encontrando está lidando com uma diretiva que está observando uma propriedade modal para uma mudança. Estou assumindo que preciso de uma diretiva que esteja procurando por uma entrada que receba foco. Como eu faria isso?
angularjs
angularjs-directive
Billy Coover
fonte
fonte
<input type="text" value="test" onclick="this.select()" />
?Respostas:
A maneira de fazer isso no Angular é criar uma diretiva personalizada que faça a seleção automática para você.
Aplique a diretiva assim:
View demo
Update1 : Removida dependência de jQuery.
Atualização2 : Restringir como atributo.
Update3 : funciona no Safari móvel. Permite selecionar parte do texto (requer IE> 8).
fonte
restrict: 'A'
), pois essa diretiva visa estender o comportamento de um elemento existente .selectOnLoad
link de diretiva (). Mas no link (), embora o escopo já esteja preenchido, o elemento DOM ainda não está sincronizado com $ scope, portanto, quando chamo select (), o elemento ainda está vazio e nada foi selecionado. A única maneira de solucionar isso que encontrei é $ timeout, mas sinto que isso pode parar de funcionar com uma nova versão do Angular.Aqui está uma diretiva aprimorada que evita selecionar novamente o texto quando o usuário clica para posicionar o cursor na caixa de entrada.
fonte
this
paraelement[0]
e deve funcionar. Também recomendo alterarclick
parafocus
que o texto seja selecionado se o usuário digitar a entrada em vez de clicar nela.Esta é uma resposta antiga, para o Angular 1.x
A melhor maneira de fazer isso é usando a
ng-click
diretiva interna:EDITAR:
Como JoshMB lembrou gentilmente; a referência a nós DOM no Angular 1.2+ não é mais permitida. Então, eu mudei
$event.target.select()
para o controlador:Então no seu controlador:
Aqui está um exemplo de violino .
fonte
Nenhuma das soluções propostas funcionou bem para mim. Após uma pesquisa rápida, vim com isso:
É uma mistura de várias soluções propostas, mas funciona tanto no clique quanto no foco (pense no foco automático) e permite a seleção manual de valor parcial na entrada.
fonte
focusedElement
?Para mim, ng-click não fazia sentido, porque você nunca poderia reposicionar o cursor sem selecionar todo o texto novamente, achei isso irritante. Então é melhor usar o ng-focus, porque o texto é selecionado apenas se a entrada não tiver sido focada. Se você clicar novamente para reposicionar o cursor, o texto será desmarcado, conforme o esperado, e você poderá escrever no meio.
Eu achei que essa abordagem era o comportamento UX esperado.
Use ng-focus
Opção 1: código separado
e no controlador
Opção 2: como alternativa, você pode associar o código acima a esse "one-liner" (não testei isso, mas deve funcionar)
fonte
No angular 2, isso funcionou para mim, tanto no Chrome quanto no Firefox:
fonte
A resposta aceita está usando o evento click, no entanto, se você usar o evento focus, apenas o 1º clique acionará o evento e também será acionado quando algum outro método for usado para focar na entrada (como pressionar a guia ou chamar o foco no código).
Isso também torna desnecessário verificar se o elemento já está focado, como sugere a resposta de Tamlyn.
fonte
this.select
.Nenhuma diretiva é necessária, basta adicionar
onfocus="this.select()"
javascript nativo ao elemento de entrada ou à área de texto.fonte
Versão modificada que funcionou para mim. Primeiro clique seleciona texto, segundo clique no mesmo elemento desmarca texto
})
fonte