IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[Curiosité] Onblur + onfocus : pas de dance en chassé-croisé


Sujet :

JavaScript

  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut [Curiosité] Onblur + onfocus : pas de dance en chassé-croisé
    Alut la cie

    Un truc marrant a essayer...


    L'événement onblur se déclanche logiquement avant l'événement onfocus, comme le confirme d'ailleur le SDK d'IE.

    Mais j'ai eu une petite surprise en voulant m'en assurer au préalable.

    Faites l'expérience vous-mêmes. Pour cela, créez deux control input-text, donnez leur une valeur pour les identifier, et attribuer leur chacun les événement onfocus et onblur comme suit :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    function whenFocus ()
    {
    	alert("Go in to " + event.srcElement.value);
    	return true;
    }
     
    function whenBlur ()
    {
    	alert("Go out from " + event.srcElement.value);
    	return true;
    }
    myCtrl1.onfocus = whenFocus;
    myCtrl1.onblur = whenBlur;
    myCtrl2.onfocus = whenFocus;
    myCtrl2.onblur = whenBlur;
    Executez la page, et là, hôôôô surprise ... la boite de dialogue du onfocus s'affiche avant celle du onblur.

    Changer maintenant le code pour avoir ceci :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function whenFocus ()
    {
    	++count;
    	alert("Go in to " + event.srcElement.value + " (" + count + ")");
    	return true;
    }
     
    function whenBlur ()
    {
    	++count;
    	alert("Go out from " + event.srcElement.value + " (" + count + ")");
    	return true;
    }
    On ajoute un petit compteur pour s'assurer du séquencement réel des choses. Et là, hooo... Re-Surprise Bien que la boite de message de onfocus s'affiche en première, le compteur qu'elle affiche est plus grand que la valeur du compteur de la boite de message de onblur. Donc bien quelle s'affiche en premier, son affichage n'a été invoqué qu'en dernier.

    Encore plus fort maintenant.

    Si vous placer l'instruction d'incrémentation du compteur aprés l'instruction alert, les deux boites de message, pour onblur et onfocus afficheront la même valeur, et à l'occurence suivante, le compteur aura bien sûre été augmenté de deux.

    Bilan : l'affichage d'une boite de message suspend l'execution du gestionnaire d'événement de onblur, et pendant ce temps, l'événement onfocus est levé, ce qui execute le gestionnaire d'événement de onfocus. Comme celui-ci n'est suspendu par rien (car pendant qu'il est suspendu par sa boite de message, aucun événement ne se produit), alors se termine avant le gestionnaire d'événement de onblur qui ne se termine que plus tard.

    Hé bien, comme quoi il n'y a pas qu'en programmation système qu'on rencontre des problème de sequencement sensible.

    Shématiquement, on a ceci :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    (en supposant que c'est myCtrl2 qui a le focus)
    
    | Action utilisateur | gestionnaire whenBlur  | gestionnaire whenFocus |
    | ----------------------------------------------------------------------
    |  clic sur myCtrl1  | déclenchement onblur   | (inerte)
    |                    | l'execution commence   | (inerte)
    |                    | appel de alert         | (inerte)
    |                    | suspension             | (inerte)
    |                    | (suspendu)             | déclenchement onfocus
    |                    | (suspendu)             | l'execution commence
    |                    | (suspendu)             | appel de alert
    |                    | (suspendu)             | le message s'affiche
    |                    | (suspendu)             | termine son execution
    |                    | reprise de l'execution | (interte)
    |                    | le message s'affiche   | (inerte)
    |                    | termine son execution  | (inerte)
    |                    | (inerte)               | (inerte)
    Et voilà comment l'execution passe de l'un à l'autre des gestionnaire d'événement.

    Alors attention au instruction qui peuvent suspendre l'execution d'un gestionnaire d'événement, et lui faire souffler la place par un autre

    La prochaine fois je vous parle du dossier caché des XFiles (ça changera)

  2. #2
    Membre habitué Avatar de dream_of_australia
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 167
    Points : 136
    Points
    136
    Par défaut
    Merci pour l'info, c'est super intéressant !! Ah les mystères de l'informatique... Quel bonheur pour les développeurs !

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 893
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 893
    Points : 16 350
    Points
    16 350
    Par défaut
    Heu, le onfocus, comme son nom l'indique, se lance lorsque l'élément a le focus, alors que le onblur se lance lorsque l'élément perd le focus.

    Donc si l'évènement onblur se lance lorsque l'élément perd le focus, ça suppose qu'il a eu le focus au préalable et donc que l'évènement onfocus a été lancé.

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Bisûnûrs
    Donc si l'évènement onblur se lance lorsque l'élément perd le focus, ça suppose qu'il a eu le focus au préalable et donc que l'évènement onfocus a été lancé.
    Je n'ai peut-être pas été assez explicite : il s'agit du cas ou il y a plusieurs contrôls. Un control A perd le focus au profit d'un control B. Alors l'événement blur du contrôl A survient avant l'événement focus du contrôl B. Et il se trouve, que comme le démontre l'expérience qui est le sujet de ce fil, quand dans certaines conditions, des instructions du gestionnaire de l'événement blur de A peuvent s'exécuter aprés les instructions du gestionnaire de l'événement focus de B.

    Citation Envoyé par Dream_of_Australia
    Merci pour l'info, c'est super intéressant !! Ah les mystères de l'informatique... Quel bonheur pour les développeurs !
    LOL tu m'étonne que je me suis amusé avec ce truc. Ca m'a fait tout drôle de tomber sur un phénomène pareil. Je ne m'attendais pas avec ça avec un truc à l'apparence aussi loin de tout ça que l'est JavaScript.

    Une autre chose que j'ai remarqué aussi :
    On cré un élément A avec document.createElement. On attache à A un gestionnaire d'événement onfocus et onblur. On insère A dans le document. On donne le focus à A. Hé bien là, il se produit un phénomène étrange : A reçois un événement focus, et reçois un événement blur juste aprés!

    Je pense que c'est dut au fait que l'élément n'a pas reçu de blur et n'avait pas d'état de focus tant qu'il n'a pas été inséré dans le document. Mais pour le coup, je me demande si cette exemple là ne trahis pas plutôt un bug (constaté sur IE6).

    P.S. En parlant de bug, je crois qu'il y en a un sur ce forum. Cette discussion avait de nouvelles réponses, et elle n'apparaissait pourtant pas dans la liste de mes abonnement ayant reçu de nouvelles réponse (alors que je suis abonné automatiquement à toute les discussion dés que j'y poste un message). Je ne sais pas si ça se produit souvent, je l'ai juste remarqué aujourd'hui, mais peut-être que manque comme ça des occasions de suivre certaines discussions...

Discussions similaires

  1. onblur, onfocus et IE9
    Par adri170 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 21/02/2013, 04h12
  2. onBlur / onFocus
    Par bilbonec dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/10/2012, 12h18
  3. onBlur, onFocus - inputs
    Par Spire_ dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 03/08/2012, 07h47
  4. [DOM] DOM onBlur onFocus CSS
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 11/06/2008, 11h37
  5. [AJAX] Ajax fonctionne sur onblur mais pas sur onkeypress
    Par julien.63 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/01/2007, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo