85 votes

La sélection de texte sur le focus avec jQuery ne fonctionne pas dans Safari et Chrome

J'ai le code jQuery suivant (similaire à cette question ) qui fonctionne dans Firefox et IE, mais échoue (pas d'erreur, juste pas de fonctionnement) dans Chrome et Safari. Avez-vous une idée de solution de contournement ?

$("#souper_fancy").focus(function() { $(this).select() });

0 votes

Je veux un comportement exact dans le safari de l'iPad/iPhone. Cela ne fonctionne pas avec les navigateurs iPod/iPhone. La réponse acceptée ci-dessous s'applique uniquement à Chrome/safari sur ordinateur.

5 votes

Remarque : la réponse acceptée ici ne résout que la moitié du problème. Elle fait fonctionner la sélection, mais il est difficile de la désélectionner ensuite avec les clics suivants. Une meilleure solution peut être trouvée ici : stackoverflow.com/questions/3380458/

188voto

C'est l'événement onmouseup qui provoque la désélection de la sélection, il suffit donc d'ajouter :

$("#souper_fancy").mouseup(function(e){
    e.preventDefault();
});

25voto

$('#randomfield').focus(function(event) {
    setTimeout(function() {$('#randomfield').select();}, 0);
});

3 votes

C'est la meilleure réponse si vous essayez de sélectionner du texte dans un champ de formulaire pour une application PhoneGap fonctionnant sous Android. Elle donne une indication visuelle à l'utilisateur que le texte est sélectionné, alors que la réponse acceptée ne le fait pas.

4voto

Joe Chung Points 6263

Cela fonctionne bien pour les éléments input type="text". Quel type d'élément est #souper_fancy ?

$("#souper_fancy").focus(function() {
    $(this).select();
});

0 votes

Il s'agit d'un élément type="text". J'ai également essayé $("input[type=text]"). Cela ne fonctionne toujours pas avec jQuery 1.3.2 dans Safari.

3voto

ThiagoPXP Points 545

Le fait d'empêcher la sélection par défaut lors du mouseup fait que la sélection de texte est activée à tout moment. L'événement MOUSEUP est chargé d'effacer la sélection de texte. Cependant, en empêchant son comportement par défaut, il est impossible de désélectionner le texte à l'aide de la souris.

Pour éviter cela et faire en sorte que la sélection de texte fonctionne à nouveau, vous pouvez définir un indicateur sur FOCUS, le lire depuis MOUSEUP et le réinitialiser afin que les futurs événements MOUSEUP fonctionnent comme prévu.

$("#souper_fancy").focus(function() {
    $(this).select();

    //set flag for preventing MOUSEUP event....
    $this.data("preventMouseUp", true);
});

$("#souper_fancy").mouseup(function(e) {
    var preventEvent = $this.data("preventMouseUp");

    //only prevent default if the flag is TRUE
    if (preventEvent) {
        e.preventDefault();
    }

    //reset flag so MOUSEUP event deselect the text
    $this.data("preventMouseUp", false);
});

2voto

SpikeMeister Points 21

Utilisez setSelectionRange() à l'intérieur d'un appel à requestAnimationFrame() :

$(document).on('focus', '._selectTextOnFocus', (e) => {
    var input = e.currentTarget;
    var initialType = e.currentTarget.type;

    requestAnimationFrame(() => {
        // input.select() is not supported on iOS
        // If setSelectionRange is use on a number input in Chrome it throws an exception,
        // so here we switch to type text first.
        input.type = "text";
        input.setSelectionRange(0, Number.MAX_SAFE_INTEGER || 9999);
        input.type = initialType;
    });
});

Utilisez setSelectionRange() au lieu de select() desde select() ne fonctionne pas dans le Safari mobile (voir Sélection programmée de texte dans un champ de saisie sur les appareils iOS (Safari mobile) ).

Il est nécessaire d'attendre en utilisant requestAnimationFrame avant de sélectionner le texte, sinon l'élément ne défile pas correctement dans la vue après l'apparition du clavier sur iOS.

Lorsque vous utilisez setSelectionRange() il est important de définir le type d'entrée sur text sinon il risque de lever des exceptions sur Chrome (voir selectionStart/selectionEnd on input type="number" n'est plus autorisé dans Chrome ).

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