entrada jquery seleccionar todo en foco


335

Estoy usando este código para intentar seleccionar todo el texto en el campo cuando un usuario se enfoca en el campo. Lo que sucede es que selecciona todo por un segundo, luego no está seleccionado y el cursor de escritura se deja donde hice clic ...

$("input[type=text]").focus(function() {
   $(this).select();
});

Quiero que todo quede seleccionado.


¿Qué navegador, parece que me funciona bien en FF?
R0MANARMY

8
Chrome = falla para este
wowo_999

1
Estaba usando Chrome, pero .click () resuelve el problema :)
Tim

4
Nota: La respuesta aceptada aquí solo resuelve la mitad del problema. Hace que la selección funcione, pero dificulta la eliminación de la selección con los siguientes clics. Puede encontrar una mejor solución aquí: stackoverflow.com/questions/3380458/…
SDC

Respuestas:


491

Intente usar en clicklugar de focus. Parece funcionar tanto para el mouse como para los eventos clave (al menos en Chrome / Mac):

jQuery <versión 1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

jQuery versión 1.7+:

$("input[type='text']").on("click", function () {
   $(this).select();
});

Aquí hay una demostración


62
el problema es que ya no se puede seleccionar parte del texto con el mouse, una vez que ocurre el clic, se selecciona el texto completo.
Helin Wang

6
No es una solución viable para mí. Esto crea el problema descrito por Wang.
Márquez

1
A continuación, Nianpeng ofrece una solución que también funciona con la selección de texto del mouse.
Philibert Perusse

4
@AwQiruiGuo $ .fn.on ('click', ..) puede usar menos memoria y trabajar para elementos secundarios agregados dinámicamente.
Ricky Boyce

7
Esto no funciona para enfocar un campo al tabular.
Colin Breame

67

Creo que lo que pasa es esto:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

Una solución alternativa puede ser llamar a select () de forma asincrónica, de modo que se ejecute completamente después de focus ():

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$ ("input [type = text]"). focus (function () {var save_this = $ (this); window.setTimeout (function () {save_this.select ();}, 100);});
etienne

@etienne: Oh, buen punto: el manejo de thises un poco inesperado en tales ámbitos. Actualizaré el código.
Piskvor salió del edificio el

3
un valor de tiempo de espera de 0 también parece estar bien, y la función "focusin ()" también funciona con este método.
Tanguy

4
sí, ni siquiera necesita establecer un período. 0 funcionará bien ya que los tiempos de espera se ejecutan al final de la pila de llamadas actual. esto significa que los eventos de enfoque y clic se activan y luego se ejecuta su función
Joshua Bambrick

1
El tiempo de espera 0 parece tener el problema de que el evento 'clic' puede dispararse en un marco posterior, deseleccionando la casilla nuevamente. Encuentro que el tiempo de espera 10 parece funcionar bastante bien, sin demoras notables, pero más confiable que 0.
Philh

59

Creo que esta es una mejor solución. A diferencia de simplemente seleccionar en el evento onclick, no impide seleccionar / editar texto con el mouse. Funciona con los principales motores de renderizado, incluido IE8.

$('input').on('focus', function (e) {
    $(this)
        .one('mouseup', function () {
            $(this).select();
            return false;
        })
        .select();
});

http://jsfiddle.net/25Mab/9/


4
Esto solo funciona para campos existentes, aquí hay una actualización para vincularlo a nuevos campos de entrada: jsfiddle.net
adriaan

A veces se puede enfocar sin hacer clic, y esto lo maneja bien. Por eso, esta para mí es la respuesta más limpia, aunque puede haber algunos oyentes de eventos colgando cada vez que se enfoca la entrada y no por un clic ... mucho mejor que setTimeout
ilovett

Esto no permite un segundo clic dentro de las entradas numéricas para seleccionar otra parte del texto con el mouse. Sin select()embargo, quitar el segundo parece funcionar.
dperish

Aún mejor con un adicional$('input[autofocus]').select();
Daniel Bleisteiner

38

Aquí hay algunas respuestas decentes y la de @ user2072367 es mi favorita, pero tiene un resultado inesperado cuando te enfocas a través de la pestaña en lugar de hacer clic. (resultado inesperado: para seleccionar texto normalmente después del enfoque a través de la pestaña, debe hacer clic una vez más)

Este violín corrige ese pequeño error y, además, almacena $ (this) en una variable para evitar la selección de DOM redundante. ¡Echale un vistazo! (:

Probado en IE> 8

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
Las soluciones +1 tuyas y @ user2072367 son las más limpias en todo este hilo y desearía que hubiera una manera de llegar a la cima más rápido.
KyleMit

1
Incluso funciona si el usuario intenta seleccionar todo el texto por sí mismo, bravo.
Vitani

Para mí, esto no funciona en ie11 en Windows 8.1. Funciona en ie11 en Windows 7 y en Windows 10
Lars Thomas Bredland

1
@LarsThomasBredland Acabo de probar win 8.1 + ie11 y funciona como se esperaba. ¿Qué "no funciona" para ti?
animatedgif

Simplemente no selecciona nada. (Probé en otro win8 y funciona allí, mismo nivel de sistema operativo y versión ie)
Lars Thomas Bredland

22

Después de una revisión cuidadosa, propongo esto como una solución mucho más limpia dentro de este hilo:

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

Demostración en jsFiddle

El problema:

Aquí hay una pequeña explicación:

Primero, echemos un vistazo al orden de los eventos cuando coloca el mouse o la pestaña en un campo.
Podemos registrar todos los eventos relevantes como este:

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

eventos de enfoque

Nota : He cambiado esta solución para usarla en clicklugar de mouseupcomo sucede más adelante en la canalización del evento y parece estar causando algunos problemas en Firefox según el comentario de @ Jocie.

Algunos navegadores intentan colocar el cursor durante los eventos mouseupo click. Esto tiene sentido ya que es posible que desee iniciar el símbolo de intercalación en una posición y arrastrar para resaltar un texto. No puede hacer una designación sobre la posición del símbolo de intercalación hasta que haya levantado el mouse. Por lo tanto, las funciones que manejan focusestán destinadas a responder demasiado pronto, dejando que el navegador anule su posicionamiento.

Pero el problema es que realmente queremos manejar el evento de enfoque. Nos permite saber la primera vez que alguien ingresa al campo. Después de ese punto, no queremos seguir anulando el comportamiento de selección del usuario.

La solución:

En cambio, dentro del focuscontrolador de eventos, podemos adjuntar rápidamente oyentes para los eventos click(hacer clic) y keyup(tabular) que están a punto de activarse.

Nota : La tecla de un evento de tabulación se activará en el nuevo campo de entrada, no en el anterior.

Solo queremos disparar el evento una vez. Podríamos usar .one("click keyup), pero esto llamaría al controlador de eventos una vez para cada tipo de evento . En cambio, tan pronto como se presione el botón mouseup o keyup, llamaremos a nuestra función. Lo primero que haremos es eliminar los controladores de ambos. De esa manera no importará si usamos la pestaña o el mouse. La función debería ejecutarse exactamente una vez.

Nota : la mayoría de los navegadores seleccionan naturalmente todo el texto durante un evento de tabulación, pero como señaló animatedgif , aún queremos manejar el keyupevento, de lo contrario, el mouseupevento seguirá persistiendo en cualquier momento en que ingresemos. Escuchamos ambos para poder convertir fuera de los oyentes tan pronto como hayamos procesado la selección.

Ahora, podemos llamar select()después de que el navegador haya realizado su selección, por lo que estamos seguros de anular el comportamiento predeterminado.

Finalmente, para mayor protección, podemos agregar espacios de nombres de eventos a las funciones mouseupy keyuppara que el .off()método no elimine ningún otro detector que pueda estar en juego.


Probado en IE 10+, FF 28+ y Chrome 35+


Alternativamente, si desea extender jQuery con una función llamada onceque se activará exactamente una vez para cualquier número de eventos :

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

Entonces puede simplificar el código aún más así:

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

Demo en violín


En Firefox 31 en Windows, su código solo selecciona el texto cada dos clics cuando hace clic entre los dos cuadros de texto
Vitani

1
@Jocie, no estoy seguro de por qué se alterna, pero parece que FF maneja la selección de texto en el clickevento que está más abajo en la tubería que mouseup. Dado que queremos manejar el final de la selección lo más tarde posible para que tengamos la mayor posibilidad de anular el navegador, usar clic en lugar de mouseup debería ser suficiente. Probado en FF, Chrome e IE.
KyleMit

1
¡Gracias! ¡Finalmente una solución que realmente funciona y en todos los navegadores!
Vincent

1
¡Si! ¡Esto también funcionó para mí! Gracias. Esta debería haber sido la respuesta oficial
Fandango68

1
@RiZKiT, oneno lo cortará como "El controlador se ejecuta una vez por elemento por tipo de evento . Automáticamente apagará el evento que lo disparó, pero el otro seguirá persistiendo y offse ocupará de ambos de todos modos. Ver mi pregunta: función que se activará exactamente una vez para cualquier número de eventos
KyleMit

13

Esto haría el trabajo y evitaría el problema de que ya no puede seleccionar parte del texto con el mouse.

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
Importante mantener la capacidad de seleccionar parte del texto con el mouse. Estoy usando esto y su A1
Philibert Perusse

2
Demasiadas cosas están sucediendo aquí, use la solución de enfoque / mouseup de user2072367
George

El de @George user2072367 es bastante bueno, pero tiene algunos defectos graves. Mira mi solución (:
animatedgif

6

Esta versión funciona en ios y también corrige la función de arrastrar para seleccionar estándar en Windows Chrome

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


Editado para agregar un intento / captura feo para apaciguar a los navegadores
anihilnine

5

El problema con la mayoría de estas soluciones es que no funcionan correctamente cuando se cambia la posición del cursor dentro del campo de entrada.

El onmouseupevento cambia la posición del cursor dentro del campo, que se dispara después onfocus(al menos dentro de Chrome y FF). Si descarta incondicionalmente mouseup, el usuario no puede cambiar la posición del cursor con el mouse.

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

El código evitará condicionalmente el mouseupcomportamiento predeterminado si el campo no tiene actualmente el foco. Funciona para estos casos:

  • hacer clic cuando el campo no está enfocado
  • haciendo clic cuando el campo tiene el foco
  • tabulando en el campo

He probado esto en Chrome 31, FF 26 e IE 11.


Esto funciona perfectamente para eventos de clic, pero si uso la pestaña para pasar al siguiente campo de entrada, veo que el contenido se selecciona y se
deselecciona

4

Encontré una solución increíble leyendo este hilo

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});

... que es esencialmente la misma respuesta que la de Piskvor .
Oliver

no se olvide de todos los demás tipos de texto HTML5, por ejemplo, 'input [type = email]'
jamiebarrow

3

Vengo de finales de 2016 y este código simplemente funciona en versiones recientes de jquery (jquery-2.1.3.js en este caso).

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

Estoy usando FF 16.0.2 y jquery 1.8.3, todo el código en la respuesta no funcionó.
Utilizo un código como este y trabajo.

$("input[type=text]").focus().select();

4
Esto no responde a la pregunta, que es cómo seleccionar el contenido de un cuadro de entrada cuando el usuario enfoca el campo . Esto enfocará y seleccionará inmediatamente el código, sin la entrada del usuario.
saludo

@saluce no entiendo lo que quieres decir? lo que quiere el interrogador es que cuando selecciona el campo, se selecciona todo el texto actual. Y mi código debería hacer eso. Incluso lo uso para mi proyecto, como el momento en que escribo esta respuesta.
GusDeCooL

1
Este código se enfocará y seleccionará todo cuando se ejecute, pero el código, en sí mismo, no está vinculado a un evento generado por el usuario , como hacer clic en el cuadro de texto. Por ejemplo, $("input[type=text]").on('click', function () { $(this).focus.select(); })está provocando que el enfoque y la selección sucedan cuando el usuario hace clic en el cuadro, porque se ejecuta cuando el usuario hace clic en el cuadro. Sin el controlador de eventos, el código no responde a la pregunta, de ahí el voto negativo y el comentario. Básicamente, tienes la parte "todo el texto actual está seleccionado" pero no la parte "cuando selecciona el campo".
saludo

1
@GusDeCooL curiosamente (aunque esto no es exactamente lo que preguntó) Quería obtener el mismo resultado que tú en esto :)
Robbie Averill

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

Use clearTimeout para mayor seguridad si cambia rápidamente entre dos entradas .. clearTimeout limpia el tiempo de espera anterior ...


Edite con más información. No se recomiendan las respuestas de solo código y "probar esto", porque no contienen contenido que se pueda buscar y no explican por qué alguien debería "probar esto". Nos esforzamos aquí por ser un recurso de conocimiento.
Brian Tompsett - 汤 莱恩

2

Funciona muy bien con JavaScript nativo select().

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

o en general:

$("input[type=text]")[0].select()

1

O simplemente puede usar <input onclick="select()">Works perfect.


no, no lo hace. funciona para seleccionar el todo. pero intente seleccionar una parte del texto manualmente, no podrá hacerlo.
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

Esto probablemente se marcará como una respuesta de baja calidad porque no tiene ninguna explicación de lo que está sucediendo.
tumultous_rooster

Tu $.readyno es correcto. Debe pasarle una función para que demore attrhasta que el documento esté listo. Lo está haciendo de inmediato y luego pasando la colección de elementos a $.ready.
doug65536

Además, evite 'onclick', particularmente de esta manera. Utilice addEventListener.
doug65536

0

Siempre uso requestAnimationFrame()para saltar sobre los mecanismos internos posteriores al evento y esto funciona perfectamente en Firefox. No lo he probado en Chrome.

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.