Selezione del testo a livello di codice in un campo di input sui dispositivi iOS (Safari mobile)


87

Come si seleziona programmaticamente il testo di un campo di input su dispositivi iOS, ad esempio iPhone, iPad con Safari mobile?

Normalmente è sufficiente chiamare la .select()funzione <input ... />sull'elemento, ma questo non funziona su quei dispositivi. Il cursore viene semplicemente lasciato alla fine della voce esistente senza che sia stata effettuata alcuna selezione.


10
Non vedo alcun motivo per cui essere un dispositivo touch cambi la rilevanza della preselezione del testo. Quello che hai detto su un dispositivo touch può essere detto altrettanto bene di un dispositivo non touch. Voglio preselezionare il testo quando un utente sceglie di toccare un elemento per modificarlo. Nella maggior parte dei casi è probabile che l'utente desideri sostituire i contenuti esistenti, nel qual caso sarebbe in grado di farlo senza dover toccare e trascinare ulteriormente. In altri casi, quando desiderano modificare il contenuto esistente, potrebbero deselezionare o modificare la selezione.
sroebuck

2
Sfortunatamente .focus (). Select () non funziona.
sroebuck

2
Sto iniziando una taglia su questo problema. Il mio obiettivo è rendere molto facile per gli utenti fare clic sulla mia area di testo e toccare "Copia" per copiare il testo negli appunti.
Dan Fabulich

Lo stesso qui .. sembrano esserci molti metodi che non funzionano in Mobile Safari .select () e .focus () sono due di questi.

@sroebuck bella risposta per David W. Keith! pollice su!
eyurdakul

Risposte:


95
input.setSelectionRange(0, 9999);

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


3
Questo ha funzionato per me, ma doveva includere l'arresto del mouseup sugli stessi input.
DuStorm

8
Questo non ha funzionato per me su un iPad o un iPhone
Doug

4
Questo ha funzionato solo per me se ho attivato .focus()l'input prima di invocare input.setSelectionRange. Se stai ascoltando l' focusevento sull'ingresso, ricorda di tenere conto di un ciclo infinito.
allieferr

10
Un trucco che vale la pena menzionare: questo non funzionerà su aree di testo se hanno l' readonlyattributo impostato.
JayPea

5
Ho passato più di un'ora a giocare con varie soluzioni. La chiamata setSelectionRange()in un focusgestore funziona quando si attiva .focus()a livello di codice, ma quando si tocca manualmente l'input di testo su iOS, la selezione non viene eseguita. Basti dire che tutto ciò che devi fare è chiamare setSelectionRange()all'interno di un setTimeout di 0 e funziona come previsto, indipendentemente da ciò che attiva il focus.

30

Niente in questo thread ha funzionato per me, ecco cosa funziona sul mio iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);

questo fottuto trucco! Grazie! funziona con l'evento "clic"
saike

Grazie mille!!
Vaclav Kusak

26

È difficile dimostrare un aspetto negativo, ma la mia ricerca suggerisce che si tratta di un bug in Mobile Safari.

Nota che focus () funziona, più o meno, anche se può richiedere più di un tocco per avere successo, e non è necessario se stai cercando di rispondere a un tocco di utente sul campo in questione poiché il tocco stesso darà al campo messa a fuoco. Sfortunatamente, select () è semplicemente non funzionante in Mobile Safari.

La soluzione migliore potrebbe essere una segnalazione di bug con Apple .


1
I nostri test indicano lo stesso. È un bug / funzionalità mancante in Safari mobile.
Nir Levy

2
FWIW, funziona su Chrome Desktop e Android Browser, anch'essi basati su WebKit.
jrummell

24

Guarda questo violino : (inserisci del testo nella casella di immissione e fai clic su "seleziona testo")

Seleziona il testo in una casella di input sul mio iPod (iOS6.0.1 di quinta generazione), apre la tastiera e mostra anche il menu Taglia / Copia / Suggerisci ...

Utilizzando semplice javascript. Non l'ho provato con jQuery

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

Nota che il numero 999 è solo un campione. È necessario impostare questi numeri sul numero di caratteri che si desidera selezionare.

AGGIORNARE:

  • iPod5 - iOS6.0.1 - Funziona bene.
  • iPad1 - iOS5.1.1 - Solo testo selezionato. Toccare una volta la selezione per aprire il menu Taglia / Copia
  • iPad2 - iOS4.3.3 - Solo testo selezionato. Toccare una volta la selezione per aprire il menu Taglia / Copia

Per gli ultimi due, potresti sperimentare attivando un evento clic inputsull'elemento

AGGIORNAMENTO: (07-10-2013)

  • iPod5 - iOS7.0.2 - Utilizzo del violino nel collegamento: non è possibile visualizzare il testo digitato nella casella di immissione. Premendo select mi reindirizza a facebook.com (??? wtf ???) senza idea di cosa stia succedendo lì.

AGGIORNAMENTO: (14-11-2013)

  • iOS 7.0.3: Grazie al commento da Binki aggiornamento che l' .selectionStarte .selectionEnd fa il lavoro.

AGGIORNAMENTO: (15-01-2015)

  • iOS 8.xx: Grazie al commento di Michael Siebert . Tratto dal commento: ho dovuto ascoltare entrambi gli eventi focus E clic e quindi impostareTimeout / _. Debounce per farlo funzionare in entrambi i casi: fai clic sull'input o focus tramite tabulazione

Sei il mio eroe per oggi! Funziona come un fascino! ;-)
andi1984

3
@ andi1984 dove posso richiedere il distintivo dell'eroe?
bart s

1
Conosci la compatibilità con altre versioni di iOS? Funziona su iOS5 e iOS4?
andi1984

1
Funziona per me su iOS6 MA a) non funziona su Chrome desktop b) non funziona quando l'input di testo è disabilitato :( Il mio caso d'uso: genera un URL univoco e desidero una condivisione facilitata.
Mars Robertson

1
@barts Immagino che tu sia finito su Facebook perché il menu "Condividi" su jsfiddle deve essere incasinato e toccabile mentre forse invisibile. Ho finito per fare clic sul pulsante Twitter invisibile io stesso durante il test con iOS-7.0.3 su un iPad. Ho anche scoperto che quando pensavo di toccare il tuo <input/>, l'iPad pensava che stessi toccando nel riquadro "CSS" di jsfiddle (in cui tutto ciò che ho digitato era invisibile). Una volta che il mio tocco è stato diretto verso il corretto <input/>, il pulsante "seleziona testo" funziona perfettamente su iOS-7.0.3 :-).
binki

7

Spiacenti, nel mio post precedente, non ho notato il Javascript che implica che volevi una risposta in Javascript.

Per ottenere ciò che desideri in UIWebView con javascript , sono riuscito a racimolare due importanti informazioni per farlo funzionare. Non sono sicuro del browser mobile.

  1. element.setSelectionRange(0,9999); fa quello che vogliamo

  2. L'evento mouseUp sta annullando la selezione

Quindi (usando Prototype):

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

fa il trucco.

opaco


3
Stiamo riscontrando lo stesso problema e abbiamo scoperto che la tua soluzione ha funzionato, ma stiamo usando jquery (mobile in realtà). / * seleziona il testo all'interno dei riempimenti * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm

1
Sto usando iOS 8 su iPad e iPhone e il codice di @DuStorm (commento sopra questo) è l'unica cosa che ha funzionato per me tra tutte le risposte fornite qui. Per ribadire, quanto segue funziona almeno su iOS 8 in Chrome e Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen

Ho dovuto usare focusininvece della messa a fuoco perché funzionasse, iOS 7
Lucas

3

Sembra che lo stato attivo funzionerà, ma solo se chiamato direttamente da un evento nativo. chiamare il focus usando qualcosa come SetTimeout non appare richiama la tastiera. Il controllo della tastiera ios è molto scarso. Non è una buona situazione.


1

Qualcosa come il seguente funziona per me su Webkit fornito con Android 2.2:

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

Vedere Chromium Issue 32865 .


1

Con iOS 7 su iPad l'unico modo in cui sono stato in grado di fare questo lavoro è stato quello di utilizzare effettivamente al <textarea></textarea>posto del <input>campo.

per esempio

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

Come impedire all'utente di modificare il testo all'interno dell'area era più difficile, poiché se rendi textarea di sola lettura il trucco di selezione non funzionerà più.


1

Sono impazzito alla ricerca di questa soluzione, mentre tutte le tue risposte hanno aiutato ad aprire un altro barattolo di vermi per me.

Il cliente voleva che l'utente fosse in grado di fare clic e selezionare tutto , e anche lasciare che l'utente 'tab' e selezionare tutto sull'iPad (con una tastiera esterna. Lo so, pazzo ...)

La mia soluzione a questo problema era riorganizzare gli eventi. Prima Focus , poi clic , quindi touchstart .

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

Spero che questo aiuti qualcuno, poiché mi avete aiutato innumerevoli volte.


-4

Se utilizzi browser compatibili con HTML5, puoi utilizzarli placeholder="xxx"nel inputtag. Quello dovrebbe fare il lavoro.


8
Non penso che questo sia ciò che la domanda si stava chiedendo
caitriona
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.