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

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;
    });
});
Tim Down
fuente
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;
            });
        }
    });
Matiesky
fuente
11

Terminé usando esto:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});
Alex
fuente
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;
});
Phil LaNasa
fuente
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.

Ztyx
fuente
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');
  });
});
Todd
fuente
¿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