89 votes

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

Comment sélectionner par programme le texte d'un champ de saisie sur des appareils iOS, par exemple un iPhone ou un iPad fonctionnant avec Safari mobile ?

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

10 votes

Je ne vois pas pourquoi le fait d'être un appareil tactile change la pertinence de la présélection de texte. Ce que vous avez dit à propos d'un périphérique tactile peut tout aussi bien être dit à propos d'un périphérique non tactile. Je veux 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 avoir à toucher et à faire glisser le texte. Dans d'autres cas, lorsqu'il souhaite modifier le contenu existant, il doit pouvoir désélectionner ou modifier la sélection.

2 votes

Malheureusement, .focus().select() ne fonctionne pas.

2 votes

Je lance un appel d'offres sur ce problème. Mon objectif est de faire en sorte qu'il soit très facile pour les utilisateurs de cliquer sur ma zone de texte et d'appuyer sur "Copier" pour copier le texte dans le presse-papiers.

95voto

jobwat Points 1213
input.setSelectionRange(0, 9999);

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

3 votes

Cela a fonctionné pour moi mais j'ai dû inclure l'arrêt du mouseup sur les mêmes entrées.

8 votes

Cela n'a pas fonctionné pour moi, que ce soit sur un iPad ou un iPhone.

4 votes

Cela n'a fonctionné pour moi que si j'ai déclenché .focus() sur l'entrée avant d'invoquer input.setSelectionRange . Si vous écoutez pour le focus sur l'entrée, n'oubliez pas de tenir compte d'une boucle infinie.

32voto

nkrop Points 121

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

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

0 votes

C'est ce qui fait l'affaire ! Merci ! fonctionne avec l'événement 'click'.

0 votes

Merci beaucoup !

26voto

clozach Points 991

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

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

Votre meilleure chance est peut-être un rapport de bogue avec Apple .

1 votes

Nos tests indiquent la même chose. Il s'agit d'un bogue ou d'une fonctionnalité manquante dans Safari mobile.

2 votes

Pour information, il fonctionne dans Chrome Desktop et Android Browser, qui sont également basés sur WebKit.

25voto

bart s Points 2811

Voir ce violon : (entrez du texte dans le champ 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....

J'utilise un simple javascript. Je n'ai pas essayé avec jQuery

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

Notez que le nombre 999 n'est qu'un exemple. Vous devez définir ces chiffres en fonction du nombre de caractères que vous souhaitez sélectionner.

UPDATE :

  • iPod5 - iOS6.0.1 - Fonctionne bien.
  • iPad1 - iOS5.1.1 - Seul le texte est sélectionné. Appuyez une fois sur la sélection pour ouvrir le menu Couper/Copier
  • iPad2 - iOS4.3.3 - Seul le texte est 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'écran de l'ordinateur. input élément

UPDATE : (07-10-2013)

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

UPDATE : (14-11-2013)

  • iOS 7.0.3 : Merci au commentaire de binki mettre à jour que le .selectionStart y .selectionEnd fait travail.

UPDATE : (15-01-2015)

  • iOS 8.x.x : Merci au commentaire de Michael Siebert . Tiré du commentaire : J'ai dû écouter à la fois les événements de focus ET de clic et ensuite définir un Timeout/_.debounce pour que cela fonctionne dans les deux cas : cliquer sur l'entrée ou se concentrer par le biais de la tabulation.

0 votes

Vous êtes mon héros du jour ! Ça marche comme sur des roulettes ! ;-)

3 votes

@andi1984 où puis-je réclamer l'insigne de héros ?

1 votes

Savez-vous s'il est compatible avec les autres versions d'iOS ? Est-ce qu'il fonctionne sur iOS5 et iOS4 ?

7voto

Matt Points 488

Désolé, dans mon message 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 con javascript J'ai réussi à rassembler deux éléments d'information importants pour le faire fonctionner. Je ne suis pas sûr pour le 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', function(event) {
      event.stop();
    });

fait l'affaire.

Matt

3 votes

Nous avons le même problème et votre solution a fonctionné - mais nous utilisons jquery (mobile en fait). /* sélectionner le texte à l'intérieur des champs à remplir */ $("input").focus(function () { this.setSelectionRange(0, 9999) ; return false ; } ).mouseup( function () { return false ; }) ;

1 votes

J'utilise iOS 8 sur iPad et iPhone, et le code de @DuStorm (commentaire au-dessus de celui-ci) 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; });

0 votes

J'ai dû utiliser focusin au lieu de se concentrer pour que cela fonctionne, iOS 7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X