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.

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

Acabei usando isso:

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

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