jQuery - seleciona todo o texto de uma área de texto


130

Como posso fazer isso quando você clica em uma área de texto, todo o seu conteúdo é selecionado?

E, eventualmente, quando você clicar novamente, para cancelar a seleção.



5
@ Blender: Não, essa pergunta diz respeito a destacar texto em um elemento, não em uma área de texto. Os dois são bem diferentes.
Tim Baixo

Respostas:


194

Para impedir que o usuário fique irritado quando todo o texto for selecionado toda vez que tentar mover o cursor usando o mouse, faça isso usando o focusevento, não o clickevento. A seguir, o trabalho é feito e soluciona um problema no Chrome que impede a versão mais simples (ou seja, apenas chamar o select()método da área de texto em um focusmanipulador de eventos).

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>

versão 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
Eu acho que é melhor implementar essas coisas usando um botão "selecionar todo o texto" separado, pois selecionar o texto automaticamente nos eventos de foco ou clique é realmente irritante.
RobG

2
isso falha para mim no Chrome, a solução de trabalho é: stackoverflow.com/a/6201757/126600
zack

@zack: O exemplo jsFiddle nesta resposta funciona para mim no Chrome. Não é para você? Concordo que a resposta que você vinculou é mais infalível.
Tim Down

@ TimDown: você está certo, eu estava sendo um pouco zeloso - na verdade, ele funciona corretamente com o 'clique', mas falha se você tabentrar na área de texto - a sua outra solução funciona para os dois casos :)
zack

Alterar o código acima um pouco e ele vai funcionar como um encanto .. $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; }); você precisa para se referir a caixa de texto sem usar thisapenas apresentá-lo com a localização completa .. e ele vai funcionar ..
pratikabu

14

Melhor maneira, com solução para problema de tabulação e cromo e nova maneira de 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

Acabei usando isso:

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

mas eu não sei como verificar se o texto já está selecionado, para que eu possa reverter as duas ações :(
Alex

1
@ Alex: Eu não mexeria muito com isso se fosse você. Os usuários esperam um comportamento padrão das áreas de texto.
Tim Baixo

não, essa área de texto específica destina-se apenas a copiar e colar. todo o texto que tenho aqui dentro é uma grande corda encryted que só pode tanto ser totalmente substituídas, ou copiados para o clipboard
Alex

@ Alex: Ah, certo. Você pode querer torná-lo somente leitura adicionando o readonlyatributo então.
Tim Baixo

1
@ Hollister: Não, é perfeitamente possível que o usuário ou o script selecione o conteúdo dentro de uma div. Você provavelmente está pensando em copiar para a área de transferência, o que não é possível no script sem uma biblioteca baseada em Flash como o ZeroClipboard.
Tim Down

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

5

Versão jQuery ligeiramente mais curta:

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

Ele lida com a caixa de canto do Chrome corretamente. Veja http://jsfiddle.net/Ztyx/XMkwm/ para um exemplo.


4

Selecionando texto em um elemento (semelhante ao destaque com o mouse)

:)

Usando a resposta aceita nesse post, você pode chamar a função assim:

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

Talvez sinalizar esta pergunta como duplicada possa ser mais útil? Não foi realmente a sua resposta, por isso seria melhor mesclar as duas perguntas.
Blender

Concordado - Embora o OP possa se beneficiar da explicação adicional para sua implementação. :)
Todd

Essa pergunta diz respeito a destacar texto em um elemento, não em uma área de texto. Os dois são bem diferentes.
Tim Baixo

obrigado, eu descobri que eu posso fazer isso com $(this).select(), eu vou usar isso porque é menos código :)
Alex
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.