jQuery: selecciona todo el texto de un área de texto


130

¿Cómo puedo hacer que cuando haga clic dentro de un área de texto, se seleccione todo su contenido?

Y, finalmente, cuando haga clic nuevamente, para anular la selección.



55
@Blender: No, esa pregunta se refiere a resaltar texto en un elemento, no en un área de texto. Los dos son bastante diferentes.
Tim Down

Respuestas:


194

Para evitar que el usuario se enfade cuando se selecciona todo el texto cada vez que intenta mover el cursor con el mouse, debe hacerlo usando el focusevento, no el clickevento. A continuación se hará el trabajo y las obras en torno a un problema en Chrome que previene la versión más simple (es decir, sólo llamar del área de texto select()método en un focuscontrolador de eventos) de trabajar.

jsFiddle: http://jsfiddle.net/NM62A/

Código:

<textarea id="foo">Some text</textarea>

<script type="text/javascript">
    var textBox = document.getElementById("foo");
    textBox.onfocus = function() {
        textBox.select();

        // Work around Chrome's little problem
        textBox.onmouseup = function() {
            // Prevent further mouseup intervention
            textBox.onmouseup = null;
            return false;
        };
    };
</script>

Versión de jQuery:

$("#foo").focus(function() {
    var $this = $(this);
    $this.select();

    // Work around Chrome's little problem
    $this.mouseup(function() {
        // Prevent further mouseup intervention
        $this.unbind("mouseup");
        return false;
    });
});

10
Creo que es mejor implementar estas cosas usando un botón separado "seleccionar todo el texto", ya que seleccionar automáticamente el texto en los eventos de enfoque o clic es realmente molesto.
RobG

2
esto me falla en Chrome, la solución de trabajo es: stackoverflow.com/a/6201757/126600
zack

@zack: El ejemplo de jsFiddle en esta respuesta me funciona en Chrome. ¿No es para ti? Estoy de acuerdo en que la respuesta que vinculaste es más infalible.
Tim Down

@TimDown: tienes razón, estaba siendo un poco entusiasta; en realidad, funciona correctamente al hacer clic, pero falla si tabingresas al área de texto; la otra solución funciona para ambos casos :)
zack

Cambie ligeramente el código anterior y funcionará como un encanto ... $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; }); debe consultar el cuadro de texto sin usarlo, thissimplemente
refiéralo

14

Mejor manera, con solución al problema de tab y Chrome y nueva forma jquery

$("#element").on("focus keyup", function(e){

        var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        if(keycode === 9 || !keycode){
            // Hacemos select
            var $this = $(this);
            $this.select();

            // Para Chrome's que da problema
            $this.on("mouseup", function() {
                // Unbindeamos el mouseup
                $this.off("mouseup");
                return false;
            });
        }
    });

11

Terminé usando esto:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});

pero no sé cómo verificar si el texto ya está seleccionado, así que puedo revertir las dos acciones :(
Alex

1
@ Alex: No me metería demasiado con esto si fuera tú. Los usuarios esperan un comportamiento estándar de las áreas de texto.
Tim Down

no, este área de texto en particular solo está diseñada para copiar y pegar. todo el texto que tengo dentro es una gran cadena encriptada que solo se puede reemplazar por completo o copiar en el portapapeles
Alex

@ Alex: Ah, cierto. Es posible que desee que sea de solo lectura agregando el readonlyatributo a continuación.
Tim Down

1
@Hollister: No, es perfectamente posible que el usuario o el script seleccionen contenido dentro de un div. Probablemente esté pensando en copiar en el portapapeles, lo que no es posible en un script sin una biblioteca basada en Flash como ZeroClipboard.
Tim Down

6
$('textarea').focus(function() {
    this.select();
}).mouseup(function() {
    return false;
});

5

Versión jQuery ligeramente más corta:

$('your-element').focus(function(e) {
  e.target.select();
  jQuery(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

Maneja la caja de la esquina de Chrome correctamente. Consulte http://jsfiddle.net/Ztyx/XMkwm/ para ver un ejemplo.


4

Seleccionar texto en un elemento (similar a resaltar con el mouse)

:)

Usando la respuesta aceptada en esa publicación, puede llamar a la función de esta manera:

$(function() {
  $('#textareaId').click(function() {
    SelectText('#textareaId');
  });
});

¿Quizás marcar esta pregunta como duplicado podría ser más útil? No era realmente su respuesta, por lo que sería mejor fusionar las dos preguntas.
Licuadora

De acuerdo: aunque el OP podría beneficiarse de la explicación adicional para su implementación. :)
Todd

Esa pregunta se refiere a resaltar texto en un elemento, no en un área de texto. Los dos son bastante diferentes.
Tim Down

gracias, descubrí que puedo hacer esto $(this).select(), lo usaré porque es menos código :)
Alex
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.