Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Ordre de préséance des événements

Envoyé par : Eric

Date : 03/07/2006 13:11

Bonjour,

Y a-t-il un moyen de forcer, l'ordre dans lequel des événements vont être traités ?

J'ai un écran divisé en deux parties :

partie gauche un treeView
partie droite les écrans de gestion dans un deck.

Un seul écran de gestion est visible à la fois. Quand on sélectionne une ligne du treeView, l'écran de gestion correspondant devient le selectedPanel du deck.

Lors d'une modification d'un écran de gestion, l'event change est capturé et un traitement a lieu. L'event change n'est envoyé par une textbox qu'après que le contrôle ait perdu le focus.

Si le curseur se trouve dans une textbox dont le contenu vient dêtre modifié et qu'on clique avec la souris sur le treeView sans au préalable déclencher le blur de la textbox, l'event select du treeview est déclenché avant l'event change de la textbox.

J'aimerais que le code lié à l'event change soit exécuté avant celui lié à l'event select.

Pour ce faire, la seule solution que j'ai trouvée à ce jour est, sur le onselect du treeView, de forcer le blur histoire que le code du onchange s'exécute au préalable.

Voici l'ordre d'exécution des fonctions :

ENTER FUNCTION ----> onTreeSelect(aEvent)
ENTER FUNCTION ----> blur()
ENTER FUNCTION ----> onChange()
EXIT FUNCTION  <---- onChange()
EXIT FUNCTION  <---- blur()
EXIT FUNCTION  <---- onTreeSelect(aEvent)

et la fonction onTreeSelect

function onTreeSelect(aEvent){
dump("ENTER FUNCTION ----> onTreeSelect(aEvent)\n");
blur();
switchPanel(aEvent);
dump("EXIT FUNCTION  <---- onTreeSelect(aEvent)\n");
}
function blur(){
dump( "ENTER FUNCTION ----> blur()\n" );
    var fcsd = document.commandDispatcher.focusedElement;
    if(fcsd){
        fcsd.blur();
    }
dump( "EXIT FUNCTION  <---- blur()\n" );
}
function switchPanel(aEvnt){
   ...
)

La question est comment être certain que le onchange déclenché par le blur s'exécutera toujours à l'intérieur de la fonction blur ? En serait -il de même si j'avais un ordinateur bi-processeur ? En fait : comment ça marche ?

# Re: Ordre de préséance des événements

Envoyé par : laurentj

Date : 03/07/2006 13:47

non, tu ne peux pas changer l'ordre des évènements. C'est gecko qui gère ça. L'utilisation d'un octoprocesseur n'y changera rien : tout se passe dans le même processus.

Sinon, les détails du fonctionnement en interne... trop long à expliquer :-)

# Re: Ordre de préséance des événements

Envoyé par : Eric

Date : 13/07/2006 15:40

Y-a-t-il alors moyen de m'expliquer le comportement suivant :

J'ai une fenêtre avec, dans sa partie supérieure un tree sur lequel est défini un listener select. Quand on sélectionne une ligne, la partie inférieure de l'écran change pour afficher les infos relatives à l'élément sélectionné.

Lorsque une information d'un élément sélectionné est modifiée, l'event change est traité par une fonction onchange.

Le problème survient quand l'utilisateur change une information et clique directement sur une nouvelle ligne de l'arbre. Il faut forcer le blur pour que le widget envoie l'event change s'il a été modifié.

Et là, sur deux essais successifs, dans le même écran, voici l'ordre d'appel des fonctions :

Essai 1

ENTER FUNCTION ----> onTreeSlct()
   ENTER FUNCTION ----> onOldItemChange()
   EXIT FUNCTION  <---- onOldItemChange()
   ENTER FUNCTION ----> showNewItem()
   EXIT FUNCTION  <---- showNewItem()
EXIT FUNCTION  <---- onTreeSlct()

Essai 2

ENTER FUNCTION ----> onTreeSlct()
   ENTER FUNCTION ----> showNewItem()
   EXIT FUNCTION  <---- showNewItem()
EXIT FUNCTION  <---- onTreeSlct()
ENTER FUNCTION ----> onOldItemChange()
EXIT FUNCTION  <---- onOldItemChange()

la fonction onTreeSlct est la suivante :

function onTreeSlct(aEvnt){
    dump("ENTER FUNCTION ----> onTreeSlct()\n");	
    var rsrc;	
    blur(); //déclenche le onOldItemChange si le widget qui a le focus a été modifié			
    var tree = aEvnt.target;
    if(tree.currentIndex > -1){
        rsrc = tree.builder.getResourceAtIndex(tree.currentIndex);
        showNewItem(rsrc);
    }
    dump("EXIT FUNCTION  <---- onTreeSlct()\n");
}

J'aimerais forçer l'exécution de la fonction onOldItemChange() avant celle de la fonction showNewItem().

Si on met un timer après le blur, cela fonctionne. L'event change provoque l'exécution de la fonction onOldItemChange avant l'exécution de la fonction showNewItem.

Mais n'y-a-t-il pas d'autres solutions ?

# Re: Ordre de préséance des événements

Envoyé par : thefab

Date : 13/07/2006 16:30

Salut,

Après quelques essais j'ai le même comportement... mais pas de solution désolé.

J'ai remarqué les points suivants:

  • Le problème survient uniquement si il y a un tree (je crois) (piste: peut-être un bug au niveau de la réception du focus sur un tree, je ne sais pas quel objet se charge de ça ?).
  • Le caret ne disparaît pas de la zone de texte lorsque le tree reçoit le focus.
  • blur(); me fais passer sur... un autre instance de Firefox ???

Fabrice

# Re: Ordre de préséance des événements

Envoyé par : thefab

Date : 13/07/2006 17:07

Oups j'ai zappé le code de ta fonction blur()... donc je suppose que c'est un CommandDispatcher qui s'occupe du focus ? et surtout pourquoi ça me fait passer vers une autre instance de Firefox... et toujours pas de solution :-(

# Re: Ordre de préséance des événements

Envoyé par : chBok

Date : 13/07/2006 20:05

Pour compléter cet échange, je vous invite à lire un article intéressant sur le sujet de la propagation des évènements.

# Re: Ordre de préséance des événements

Envoyé par : thefab

Date : 14/07/2006 07:58

Excellent lien mais le problème vient (je suppose) d'un bug dans le tree qui déclanche l'évènement 'select' trop tôt (avant même qu'il aille le focus !) et la propagation n'y est pas pour grand chose... c'est l'ordre entre les différents éléments. Voici l'odre des évènements:

tree.onselect
textbox.onblur
textbox.onchange
tree.onfocus

Alors que selon toute logique ça devrait être:

textbox.onblur
textbox.onchange
tree.onfocus
tree.onselect <-- Après avoir eu le focus

De plus l'évènement onchange n'est pas déclanché tant que le focus n'a pas parcourut tous les éléments ???

Fabrice

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.