231 votes

Détection du remplissage automatique du navigateur

Comment savoir si un navigateur a rempli automatiquement une zone de texte ? En particulier avec les champs de nom d'utilisateur et de mot de passe qui se remplissent automatiquement au moment du chargement de la page.

Ma première question est la suivante : quand cela se produit-il dans la séquence de chargement de la page ? Est-ce avant ou après document.ready ?

Deuxièmement, comment puis-je utiliser la logique pour savoir si cela s'est produit ? Ce n'est pas que je veuille l'empêcher de se produire, je veux juste m'accrocher à l'événement. De préférence, quelque chose comme ceci :

if (autoFilled == true) {

} else {

}

Si possible, j'aimerais voir un jsfiddle montrant votre réponse.

Duplicatas possibles

Événement DOM pour le remplissage automatique du mot de passe dans le navigateur ?

Autofill du navigateur et événements déclenchés par Javascript

--Ces deux questions n'expliquent pas vraiment quels événements sont déclenchés, elles se contentent de revérifier continuellement la zone de texte (ce qui n'est pas bon pour les performances !).

1 votes

La vérification prend quelques microsecondes alors que l'intervalle serait de lancer la vérification toutes les 100 millisecondes environ... comment cela va-t-il affecter les performances ? S'il existait un événement déclenché par le navigateur, je suis sûr qu'ils l'auraient utilisé.

0 votes

Je vois ce que vous voulez dire, mais cela dépend de la première partie de ma question, à savoir si JavaScript est même conscient qu'un changement vient d'avoir lieu (par exemple, avant document.ready).

1 votes

LA MEILLEURE solution pour Chrome / WebKit est d'utiliser le sélecteur DOM : document.querySelectorAll('input:-webkit-autofill') ; après un court délai setTimeout(... code ici... 250) ;

148voto

Afrin Points 577

Le problème est que le remplissage automatique est géré différemment par les différents navigateurs. Certains envoient l'événement de modification, d'autres non. Il est donc presque impossible de s'accrocher à un événement qui est déclenché lorsque le navigateur remplit automatiquement un champ de saisie.

  • Changez le déclencheur d'événement pour les différents navigateurs :

    • Pour les champs nom d'utilisateur/mot de passe :

      1. Firefox 4, IE 7 et IE 8 n'envoient pas l'événement de changement.
      2. Safari 5 et Chrome 9 envoient l'événement de changement.
    • Pour les autres champs de formulaire :

      1. IE 7 et IE 8 n'envoient pas l'événement de changement.
      2. Firefox 4 envoie l'événement de modification lorsque les utilisateurs sélectionnent une valeur dans une liste de suggestions et quittent le champ avec la touche de tabulation.
      3. Chrome 9 n'envoie pas l'événement de modification.
      4. Safari 5 envoie l'événement de changement.

La meilleure solution consiste à désactiver la saisie semi-automatique pour un formulaire à l'aide de la commande autocomplete="off" dans votre formulaire ou sondage à intervalles réguliers pour voir s'il est rempli.

Pour ce qui est de savoir si les champs sont remplis avant ou après le fichier document.ready, cela varie d'un navigateur à l'autre et même d'une version à l'autre. Pour les champs nom d'utilisateur/mot de passe, le champ mot de passe n'est rempli que lorsque vous sélectionnez un nom d'utilisateur. En somme, vous obtiendrez un code très désordonné si vous essayez de l'attacher à un événement.

Vous pouvez lire ce qui suit ICI

41 votes

Veuillez noter qu'il y a une différence entre l'autocomplétion et le remplissage automatique. L'OP fait spécifiquement référence aux navigateurs qui remplissent les données de connexion enregistrées lors du chargement de la page.

2 votes

Une astuce habituelle consiste à placer une souris sur une partie importante de la page. L'événement est déclenché lorsque la souris de l'utilisateur se dirige vers le bouton ou autre.

1 votes

@Bryce Personnellement, j'opterais pour un événement " flou ", car le remplissage automatique est quelque chose qui se produit après que vous ayez saisi la zone de saisie. Ce n'est évidemment pas l'idéal, mais comme solution de repli pour les navigateurs mentionnés ci-dessus, cela peut être très utile.

14voto

LcSalazar Points 7021

Juste au cas où quelqu'un cherche une solution (comme je l'ai fait aujourd'hui), pour écouter un changement de remplissage automatique du navigateur, voici une méthode jquery personnalisée que j'ai construite, juste pour simplifier le processus d'ajout d'un écouteur de changement à une entrée :

    $.fn.allchange = function (callback) {
        var me = this;
        var last = "";
        var infunc = function () {
            var text = $(me).val();
            if (text != last) {
                last = text;
                callback();
            }
            setTimeout(infunc, 100);
        }
        setTimeout(infunc, 100);
    };

Vous pouvez l'appeler comme ça :

$("#myInput").allchange(function () {
    alert("change!");
});

1 votes

Pour une raison quelconque, ce code ne fonctionne pas sur la page de redirection (lorsque je me déconnecte de l'application et que je suis redirigé vers la page de connexion où le remplissage automatique se produit). En revanche, il fonctionne lors du rafraîchissement de la page.

2 votes

Cela semble être un sacré consommateur de batterie mobile :/

0 votes

@StefanFisk - Pas vraiment. Une simple minuterie répétitive définie au niveau JS d'une page de navigateur n'est pas suffisante pour avoir un impact sur votre batterie, car il se passe tellement de choses dans la plupart des pages web..... Vous pensez vraiment google.com ne fixe pas de minuterie récurrente ? Quel défaut de gestion de l'énergie ce serait si je pouvais programmer simplement avec JS une page web qui vide la batterie d'un utilisateur.....

6voto

Bucket Points 86

Malheureusement, la seule façon fiable que j'ai trouvée pour vérifier cela dans les différents navigateurs est d'interroger l'entrée. Pour le rendre réactif, il faut également écouter les événements. Chrome a commencé à cacher les valeurs de remplissage automatique du javascript, ce qui nécessite un hack.

  • Sondage toutes les demi-secondes ou tous les tiers de secondes (dans la plupart des cas, il n'est pas nécessaire que le sondage soit instantané).
  • Déclenchez l'événement de changement à l'aide de JQuery, puis faites votre logique dans une fonction qui écoute l'événement de changement.
  • Ajout d'un correctif pour les valeurs de mot de passe cachées du remplissage automatique de Chrome.

    $(document).ready(function () {
        $('#inputID').change(YOURFUNCTIONNAME);
        $('#inputID').keypress(YOURFUNCTIONNAME);
        $('#inputID').keyup(YOURFUNCTIONNAME);
        $('#inputID').blur(YOURFUNCTIONNAME);
        $('#inputID').focusin(YOURFUNCTIONNAME);
        $('#inputID').focusout(YOURFUNCTIONNAME);
        $('#inputID').on('input', YOURFUNCTIONNAME);
        $('#inputID').on('textInput', YOURFUNCTIONNAME);
        $('#inputID').on('reset', YOURFUNCTIONNAME);
    
        window.setInterval(function() {
            var hasValue = $("#inputID").val().length > 0;//Normal
            if(!hasValue){
                hasValue = $("#inputID:-webkit-autofill").length > 0;//Chrome
            }
    
            if (hasValue) {
                $('#inputID').trigger('change');
            }
        }, 333);
    });

0 votes

Le problème pour moi était d'utiliser attr('value') au lieu de val() . Contrairement à val() , attr('value') ne contient pas de valeur autofilled (Firefox) !

6voto

Camilo Martin Points 5586

Ma solution :

Ecoutez change comme vous le feriez normalement, et lors du chargement du contenu du DOM, faites ceci :

setTimeout(function() {
    $('input').each(function() {
        var elem = $(this);
        if (elem.val()) elem.change();
    })
}, 250);

Cela déclenchera les événements de modification pour tous les champs qui ne sont pas vides avant que l'utilisateur ait eu la possibilité de les modifier.

0 votes

Parfait. La première solution que j'ai trouvée qui fonctionne avec Chrome !

3 votes

C'est vraiment @RidIculous comment certaines solutions peuvent être simples.

4 votes

Mais elem.val() renvoie une chaîne vide pour les champs de mot de passe remplis automatiquement dans chrome :(

5voto

David Points 3254

Il existe un nouveau composant polyfill pour résoudre ce problème sur github. Jetez un coup d'œil à autofill-event . Il suffit de l'installer et voilà, le remplissage automatique fonctionne comme prévu.

bower install autofill-event

0 votes

Cela a bien fonctionné avec les formulaires personnalisés jQuery. Je l'ai simplement ajouté et mes listes de sélection personnalisées ont fonctionné à merveille avec le remplissage automatique.

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