Tengo una entrada de texto. Cuando la entrada recibe el foco, quiero seleccionar el texto dentro de la entrada.
Con jQuery lo haría de esta manera:
<input type="text" value="test" />
$("input[type=text]").click(function() {
$(this).select();
// would select "test" in this example
});
He buscado alrededor para tratar de encontrar la forma Angular, pero la mayoría de los ejemplos que estoy encontrando están tratando con una directiva que está viendo una propiedad modal para un cambio. Supongo que necesito una directiva que esté pendiente de una entrada que reciba atención. ¿Como podría hacerlo?
angularjs
angularjs-directive
Billy Coover
fuente
fuente
<input type="text" value="test" onclick="this.select()" />
?Respuestas:
La forma de hacer esto en Angular es crear una directiva personalizada que haga la selección automática por usted.
Aplica la directiva así:
View demo
Actualización 1 : Se eliminó la dependencia de jQuery.
Actualización2 : Restringir como atributo.
Actualización3 : Funciona en Safari móvil. Permite seleccionar parte del texto (requiere IE> 8).
fuente
restrict: 'A'
), ya que esta directiva tiene como objetivo extender el comportamiento de un elemento existente .selectOnLoad
enlace de directiva (). Pero en link (), aunque el alcance ya está poblado, el elemento DOM aún no está sincronizado con $ scope, por lo que cuando llamo select (), el elemento todavía está vacío y no se selecciona nada. La única forma de evitar esto que encontré es $ timeout, pero creo que puede dejar de funcionar con alguna nueva versión angular.Aquí hay una directiva mejorada que evita volver a seleccionar el texto cuando el usuario hace clic para colocar el cursor en el cuadro de entrada.
fuente
this
aelement[0]
y debería funcionar. También recomiendo cambiarclick
afocus
para que el texto se seleccione si el usuario tabula la entrada en lugar de hacer clic en ella.Esta es una vieja respuesta, para Angular 1.x
La mejor manera de hacerlo es utilizando la
ng-click
directiva integrada:EDITAR:
Como JoshMB ha recordado amablemente; ya no se permite hacer referencia a nodos DOM en Angular 1.2+. Entonces, me mudé
$event.target.select()
al controlador:Luego en su controlador:
Aquí hay un ejemplo de violín .
fuente
Ninguna de las soluciones propuestas funcionó bien para mí. Después de una investigación rápida, se me ocurrió esto:
Es una combinación de varias soluciones propuestas, pero funciona tanto en clic como en enfoque (piense en el enfoque automático) y permite la selección manual de valor parcial en la entrada.
fuente
focusedElement
?Para mí, ng-click no tenía sentido, porque nunca podías reposicionar el cursor sin seleccionar todo el texto nuevamente, encontré que esto era molesto. Entonces es mejor usar ng-focus, porque el texto se selecciona solo si la entrada no estaba enfocada, si hace clic nuevamente para reposicionar el cursor, el texto simplemente deselecciona, como se esperaba, y puede escribir en el medio.
Encontré que este enfoque es el comportamiento UX esperado.
Use ng-focus
Opción 1: código separado
y en controlador
Opción 2: como alternativa, puede unir el código anterior en este "one-liner" (no probé esto pero debería funcionar)
fuente
En angular 2, esto funcionó para mí, tanto en Chrome como en Firefox:
fuente
La respuesta aceptada es usar el evento de clic; sin embargo, si usa el evento de enfoque, solo el primer clic activará el evento y también se disparará cuando se use algún otro método para enfocarse en la entrada (como presionar la pestaña o llamar al foco en el código).
Esto también hace innecesario verificar si el elemento ya está enfocado como sugiere la respuesta de Tamlyn.
fuente
this.select
.No se necesitan directivas, solo agregue
onfocus="this.select()"
JavaScript nativo al elemento de entrada o área de texto.fuente
Versión modificada que funcionó para mí. El primer clic selecciona el texto, el segundo clic en el mismo elemento deselecciona el texto
})
fuente