Sélection de texte par programme dans un champ de saisie sur les appareils iOS (Safari mobile)

87

Comment sélectionnez-vous par programme le texte d'un champ de saisie sur les appareils iOS, par exemple iPhone, iPad exécutant Safari mobile?

Normalement, il suffit d'appeler la .select()fonction sur l' <input ... />élément, mais cela ne fonctionne pas sur ces appareils. Le curseur est simplement laissé à la fin de l'entrée existante sans aucune sélection.

sroebuck
la source
10
Je ne vois aucune raison pour laquelle le fait d'être un appareil tactile change la pertinence de la présélection du texte. Ce que vous avez dit à propos d'un appareil tactile peut également être dit d'un appareil non tactile. Je souhaite présélectionner du texte lorsqu'un utilisateur choisit de toucher un élément pour le modifier. Dans la plupart des cas, l'utilisateur voudra probablement remplacer le contenu existant, auquel cas il pourra le faire sans toucher ni faire glisser. Dans d'autres cas, lorsqu'ils souhaitent modifier le contenu existant, ils pourront désélectionner ou modifier la sélection.
sroebuck
2
Malheureusement .focus (). Select () ne fonctionne pas.
sroebuck
2
Je commence une prime sur ce problème. Mon objectif est de permettre aux utilisateurs de cliquer très facilement sur ma zone de texte et d'appuyer sur "Copier" pour copier le texte dans le presse-papiers.
Dan Fabulich
Pareil ici ... il semble y avoir beaucoup de méthodes qui ne fonctionnent pas dans Mobile Safari .select () et .focus () en sont deux.
@sroebuck belle réponse pour David W. Keith! pouces vers le haut!
eyurdakul

Réponses:

95
input.setSelectionRange(0, 9999);

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

jobwat
la source
3
Cela a fonctionné pour moi, mais a dû inclure l'arrêt de la souris sur les mêmes entrées.
DuStorm
8
Cela n'a pas fonctionné pour moi sur un iPad ou un iPhone
Doug
4
Cela ne fonctionnait pour moi que si je déclenchais .focus()sur l'entrée avant d'appeler input.setSelectionRange. Si vous écoutez l' focusévénement sur l'entrée, n'oubliez pas de tenir compte d'une boucle infinie.
allieferr
10
Un piège qui mérite d'être mentionné: cela ne fonctionnera pas sur les zones de texte si elles ont l' readonlyattribut défini.
JayPea
5
J'ai passé plus d'une heure à jouer avec diverses solutions. L'appel setSelectionRange()d'un focusgestionnaire fonctionne lorsque vous déclenchez par .focus()programme, mais lorsque vous appuyez manuellement sur l'entrée de texte sur iOS, la sélection ne se produit pas. Qu'il suffise de dire, tout ce que vous avez à faire est d'appeler setSelectionRange()dans un setTimeout de 0 et cela fonctionne comme prévu, peu importe ce qui déclenche le focus.
30

Rien dans ce fil n'a fonctionné pour moi, voici ce qui fonctionne sur mon iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);
nkrop
la source
cela fait le truc f ** kin! Merci! fonctionne avec l'événement 'click'
saike
Merci beaucoup!!
Vaclav Kusak
26

Il est difficile de prouver un négatif, mais mes recherches suggèrent qu'il s'agit d'un bogue dans Mobile Safari.

Notez que focus () fonctionne, plus ou moins - bien que cela puisse nécessiter plus d'un tap pour réussir, et ce n'est pas nécessaire si vous essayez de répondre à un utilisateur tapant sur le champ en question car le tap lui-même donnera le champ concentrer. Malheureusement, select () n'est tout simplement pas fonctionnel dans Mobile Safari.

Votre meilleur pari peut être un rapport de bogue avec Apple .

Clozach
la source
1
Nos tests indiquent la même chose. C'est un bug / une fonctionnalité manquante dans le safari mobile.
Nir Levy
2
FWIW, il fonctionne dans Chrome Desktop et Android Browser, également basés sur WebKit.
jrummell
24

Voir ce violon : (entrez du texte dans la zone de saisie et cliquez sur 'sélectionner le texte')

Il sélectionne du texte dans une zone de saisie sur mon iPod (5e génération iOS6.0.1), ouvre le clavier et affiche également le menu Couper / Copier / Suggérer ...

Utilisation de javascript simple. Je n'ai pas essayé cela avec jQuery

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

Notez que le nombre 999 n'est qu'un échantillon. Vous devez définir ces nombres sur le nombre de caractères que vous souhaitez sélectionner.

MISE À JOUR:

  • iPod5 - iOS6.0.1 - Fonctionnement correct.
  • iPad1 - iOS5.1.1 - Seul le texte sélectionné. Appuyez une fois sur la sélection pour ouvrir le menu Couper / Copier
  • iPad2 - iOS4.3.3 - Seul le texte sélectionné. Appuyez une fois sur la sélection pour ouvrir le menu Couper / Copier

Pour les deux derniers, vous pouvez expérimenter en déclenchant un événement de clic sur l' inputélément

MISE À JOUR: (07-10-2013)

  • iPod5 - iOS7.0.2 - Utilisation du violon dans le lien: Impossible de voir le texte saisi dans la zone de saisie. Appuyer sur select me redirige vers facebook.com (??? wtf ???) aucune idée de ce qui se passe là-bas.

MISE À JOUR: (14-11-2013)

  • iOS 7.0.3: Merci au commentaire de binki mise à jour le .selectionStartet .selectionEnd ne fait le travail.

MISE À JOUR: (15-01-2015)

  • iOS 8.xx: Merci au commentaire de Michael Siebert . Tiré du commentaire: j'ai dû écouter à la fois les événements de focus ET de clic, puis setTimeout / _. Debounce pour que cela fonctionne dans les deux cas: cliquez sur l'entrée ou sur le focus par tabulation
bart s
la source
Tu es mon héros pour aujourd'hui! Fonctionne comme un charme! ;-)
andi1984
3
@ andi1984 où puis-je réclamer le badge de héros?
bart s
1
Connaissez-vous la compatibilité avec les autres versions d'iOS? Fonctionne-t-il sur iOS5 et iOS4?
andi1984
1
Fonctionne pour moi sur iOS6 MAIS a) ne fonctionne pas sur le bureau Chrome b) ne fonctionne pas lorsque la saisie de texte est désactivée: (Mon cas d'utilisation: je génère une URL unique et je souhaite faciliter le partage.
Mars Robertson
1
@barts Je vais deviner que vous vous êtes retrouvé sur Facebook parce que le menu «Partager» de jsfiddle doit être foiré et tappable alors qu'il est peut-être invisible. J'ai fini par cliquer moi-même sur le bouton Twitter invisible lors du test avec iOS-7.0.3 sur un iPad. J'ai également constaté que lorsque je pensais que je tapotais sur votre <input/>, l'iPad pensait que je tapotais dans le volet «CSS» de jsfiddle (où tout ce que j'ai tapé était invisible). Une fois que j'ai eu mon robinet dirigé vers le bon <input/>, votre bouton "sélectionner le texte" fonctionne parfaitement bien sur iOS-7.0.3 :-).
binki
7

Désolé, dans mon article précédent, je n'ai pas remarqué le Javascript impliquant que vous vouliez une réponse en Javascript.

Pour obtenir ce que vous voulez dans UIWebView avec javascript , j'ai réussi à rassembler deux informations importantes pour que cela fonctionne. Je ne suis pas sûr du navigateur mobile.

  1. element.setSelectionRange(0,9999); fait ce que nous voulons

  2. L'événement mouseUp annule la sélection

Ainsi (en utilisant Prototype):

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

fait l'affaire.

Mat

Mat
la source
3
Nous rencontrons le même problème et avons trouvé que votre solution fonctionnait - mais nous utilisons jquery (mobile en fait). / * sélectionner le texte à l'intérieur des fill-ins * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm
1
J'utilise iOS 8 sur iPad et iPhone, et le code de @DuStorm (commentaire ci-dessus) est la seule chose qui a fonctionné pour moi parmi toutes les réponses données ici. Pour réitérer, ce qui suit fonctionne au moins sur iOS 8 dans Chrome et Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen
J'ai dû utiliser focusinau lieu de me concentrer pour que cela fonctionne, iOS 7
Lucas
3

Il semble que le focus fonctionnera, mais uniquement lorsqu'il est appelé directement à partir d'un événement natif. l'appel du focus en utilisant quelque chose comme SetTimeout n'apparaît pas appeler le clavier. Le contrôle du clavier ios est très médiocre. Ce n'est pas une bonne situation.

yodais vert
la source
1

Quelque chose comme ce qui suit fonctionne pour moi pour moi sur Webkit fourni avec Android 2.2:

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

Consultez le numéro 32865 de Chromium .

Robocat
la source
1

Avec iOS 7 sur iPad, la seule façon dont j'ai pu faire ce travail était de l'utiliser <textarea></textarea>au lieu du <input>champ.

par exemple

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

Comment empêcher l'utilisateur de modifier le texte à l'intérieur de la zone était plus difficile, car si vous créez une zone de texte en lecture seule, l'astuce de sélection ne fonctionnera plus.

Mikael Lepistö
la source
1

Je suis devenu fou à la recherche de cette solution, alors que toutes vos réponses l'ont aidé à ouvrir une autre boîte de vers pour moi.

Le client voulait que l'utilisateur puisse tout cliquer et tout sélectionner , et aussi laisser l'utilisateur «tabuler» et tout sélectionner sur l'iPad (avec un clavier externe. Je sais, fou ...)

Ma solution à ce problème était de réorganiser les événements. Première mise au point , puis cliquez , puis touchez pour démarrer .

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

J'espère que cela aide quelqu'un, car vous m'avez beaucoup aidé d'innombrables fois.

adnan tariq
la source
-4

Si vous utilisez des navigateurs compatibles HTML5, vous pouvez utiliser placeholder="xxx"dans votre inputbalise. Cela devrait faire le travail.

DrMad
la source
8
Je ne pense pas que ce soit ce que la question posait
caitriona