Seleção de texto programaticamente em um campo de entrada em dispositivos iOS (Safari móvel)

87

Como você seleciona programaticamente o texto de um campo de entrada em dispositivos iOS, por exemplo, iPhone, iPad executando Safari móvel?

Normalmente, é suficiente chamar a .select()função no <input ... />elemento, mas isso não funciona nesses dispositivos. O cursor é simplesmente deixado no final da entrada existente sem nenhuma seleção feita.

sroebuck
fonte
10
Não vejo nenhuma razão para que ser um dispositivo de toque mude a relevância da pré-seleção do texto. O que você disse sobre um dispositivo de toque também pode ser dito sobre um dispositivo sem toque. Desejo pré-selecionar o texto quando um usuário escolhe tocar em um item para editá-lo. Na maioria dos casos, é provável que o usuário deseje substituir o conteúdo existente, caso em que seria capaz de fazer isso sem precisar tocar e arrastar mais. Em outros casos, quando quiserem editar o conteúdo existente, eles poderão desmarcar ou alterar a seleção.
sroebuck
2
Infelizmente .focus (). Select () não funciona.
sroebuck
2
Estou começando uma recompensa por esse problema. Meu objetivo é tornar muito fácil para os usuários clicarem na minha área de texto e tocar em "Copiar" para copiar o texto para a área de transferência.
Dan Fabulich
O mesmo aqui .. parece haver muitos métodos que não funcionam no Mobile Safari .select () e .focus () são dois deles.
@sroebuck boa resposta para David W. Keith! afirmativo!
eyurdakul

Respostas:

95
input.setSelectionRange(0, 9999);

https://developer.mozilla.org/en/DOM/Input.select

jobwat
fonte
3
Isso funcionou para mim, mas teve que incluir a interrupção do mouseup nas mesmas entradas.
DuStorm
8
Isso não funcionou para mim em um iPad ou iPhone
Doug
4
Isso só funcionou para mim se eu acionar .focus()a entrada antes de invocar input.setSelectionRange. Se você estiver ouvindo o focusevento na entrada, lembre-se de levar em consideração um loop infinito.
allieferr
10
Uma pegadinha que vale a pena mencionar: isso não funcionará em áreas de texto se elas tiverem o readonlyatributo definido.
JayPea
5
Passei mais de uma hora brincando com várias soluções. Chamar setSelectionRange()um focusmanipulador funciona quando você aciona .focus()programaticamente, mas quando você toca manualmente na entrada de texto no iOS, a seleção não acontece. Basta dizer que tudo o que você precisa fazer é chamar setSelectionRange()dentro de um setTimeout de 0 e ele funciona conforme o esperado, não importa o que acione o foco.
30

Nada neste tópico funcionou para mim, aqui está o que funciona no meu iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);
nkrop
fonte
isso faz o maldito truque! Obrigado! funciona com o evento 'click'
saike,
Muito obrigado !!
Vaclav Kusak
26

É difícil provar uma negativa, mas minha pesquisa sugere que este é um bug no Mobile Safari.

Observe que focus () funciona, mais ou menos - embora possa exigir mais de um toque para ter sucesso, e não é necessário se você estiver tentando responder a um toque do usuário no campo em questão, pois o próprio toque dará ao campo foco. Infelizmente, seleccione () é simplesmente não-funcionais no Mobile Safari.

Sua melhor aposta pode ser um relatório de bug com a Apple .

clozach
fonte
1
Nossos testes indicam o mesmo. É um bug / recurso ausente no safari móvel.
Nir Levy,
2
FWIW, funciona no Chrome Desktop e no navegador Android, que também são baseados no WebKit.
jrummell de
24

Veja este violino : (insira algum texto na caixa de entrada e clique em 'selecionar texto')

Ele está selecionando texto em uma caixa de entrada no meu iPod (5ª geração iOS6.0.1), abrindo o teclado e também mostrando o menu Cortar / Copiar / Sugerir ...

Usando javascript simples. Não tentei isso com jQuery

document.getElementById("p1").selectionStart = 0
document.getElementById("p1").selectionEnd = 999

Observe que o número 999 é apenas uma amostra. Você deve definir esses números para o número de caracteres que deseja selecionar.

ATUALIZAR:

  • iPod5 - iOS6.0.1 - Funcionando bem.
  • iPad1 - iOS5.1.1 - Somente texto selecionado. Toque na seleção uma vez para abrir o menu Cortar / Copiar
  • iPad2 - iOS4.3.3 - Somente texto selecionado. Toque na seleção uma vez para abrir o menu Cortar / Copiar

Para os dois últimos, você pode experimentar disparar um evento de clique no inputelemento

ATUALIZAÇÃO: (07-10-2013)

  • iPod5 - iOS7.0.2 - Usando o violino no link: Não consigo ver o texto digitado na caixa de entrada. Pressionar selecionar me redireciona para facebook.com (??? wtf ???) sem ideia do que está acontecendo lá.

ATUALIZAÇÃO: (14-11-2013)

  • iOS 7.0.3: Graças ao comentário de binki atualização que o .selectionStarte .selectionEnd faz o trabalho.

ATUALIZAÇÃO: (15-01-2015)

  • iOS 8.xx: Obrigado ao comentário de Michael Siebert . Retirado do comentário: eu tive que ouvir os eventos focus E click e setTimeout / _. Debounce para fazer funcionar em ambos os casos: clicar na entrada ou focar por meio de tabulação
Bart s
fonte
Você é meu herói de hoje! Funciona como um encanto! ;-)
andi1984
3
@ andi1984 onde posso reivindicar o emblema de herói?
Bart s
1
Você sabe sobre a compatibilidade com outras versões do iOS? Funciona no iOS5 e iOS4?
andi1984
1
Funciona para mim no iOS6, MAS a) não funciona no Chrome para desktop b) não funciona quando a entrada de texto está desativada :( Meu caso de uso: Eu gero um URL exclusivo e quero facilitar o compartilhamento.
Mars Robertson
1
@barts, suponho que você acabou no Facebook porque o menu “Compartilhar” no jsfiddle deve estar bagunçado e pode ser tocado, embora talvez esteja invisível. Acabei clicando no botão invisível do Twitter ao testar o iOS-7.0.3 em um iPad. Também descobri que quando pensei que estava tocando no seu <input/>, o iPad pensou que eu estava tocando no painel “CSS” do jsfiddle (em que tudo o que eu digitei fica invisível). Assim que meu toque for direcionado ao correto <input/>, o botão “selecionar texto” funciona perfeitamente bem no iOS-7.0.3 :-).
binki
7

Desculpe, na minha postagem anterior, não percebi o Javascript implicando que você queria uma resposta em Javascript.

Para obter o que deseja em UIWebView com javascript , consegui reunir duas informações importantes para fazê-lo funcionar. Não tenho certeza sobre o navegador móvel.

  1. element.setSelectionRange(0,9999); faz o que nós queremos

  2. O evento mouseUp está desfazendo a seleção

Assim (usando Protótipo):

    input.observe ('focus', function () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', function (event) {
      event.stop ();
    });

faz o truque.

Matt

Matt
fonte
3
Estamos tendo o mesmo problema e descobrimos que sua solução funcionou - mas estamos usando jquery (móvel, na verdade). / * selecione o texto dentro dos preenchimentos * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm
1
Estou usando o iOS 8 no iPad e no iPhone, e o código de @DuStorm (comentário acima deste) é a única coisa que funcionou para mim dentre todas as respostas dadas aqui. Para reiterar, o seguinte funciona pelo menos no iOS 8 no Chrome e Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen
Tive que usar em focusinvez de foco para que funcionasse, iOS 7
Lucas
3

Parece que o foco funcionará, mas apenas quando chamado diretamente de um evento nativo. chamar focus usando algo como SetTimeout não aparece chamar o teclado. O controle do teclado ios é muito ruim. Não é uma boa situação.

yodaisgreen
fonte
1

Algo como o seguinte está funcionando para mim no Webkit que vem com o Android 2.2:

function trySelect(el) {
    setTimeout(function() {
        try {
            el.select();
        } catch (e) {
        }
    }, 0);
}

Consulte o problema 32865 do Chromium .

robocat
fonte
1

Com o iOS 7 no iPad, a única maneira de fazer isso funcionar foi usando na verdade em <textarea></textarea>vez do <input>campo.

por exemplo

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</textarea>

Como evitar que o usuário altere o texto dentro da área foi mais difícil, já que você torna textarea somente leitura, o truque de seleção não funcionará mais.

Mikael Lepistö
fonte
1

Eu enlouqueci procurando por essa solução, enquanto todas as suas respostas ajudaram a abrir outra lata de minhocas para mim.

O cliente queria que o usuário pudesse clicar e selecionar tudo , e também deixar o usuário 'tab' e selecionar tudo no iPad (com um teclado externo. Eu sei, loucura ...)

Minha solução para esse problema foi reorganizar os eventos. Focalize primeiro , clique em e toque em iniciar .

$('#myFUBARid').on('focus click touchstart', function(e){
  $(this).get(0).setSelectionRange(0,9999);
  //$(this).css("color", "blue");
  e.preventDefault();
});

Espero que isso ajude alguém, já que vocês me ajudaram inúmeras vezes.

Adnan Tariq
fonte
-4

Se estiver usando navegadores compatíveis com HTML5, você pode usar placeholder="xxx"em sua inputtag. Isso deve fazer o trabalho.

DrMad
fonte
8
Acho que não era isso que a pergunta estava perguntando
caitriona