2009-09-07 7 views
0

Nous avons un système Web qui utilise une combinaison d'événements OnBlur et OnMouseDown. Malheureusement, pour une raison étrange, le gestionnaire d'événement OnMouseDown est déclenché avant d'appeler le gestionnaire d'événement OnBlur.Définition des priorités sur les événements HTML

Ce n'est pas ce que nous voulons. Au lieu de cela, nous souhaitons toujours appeler le gestionnaire d'événements OnBlur avant d'appeler le gestionnaire d'événement onMouseDown. Y a-t-il un moyen de le faire, en donnant peut-être à l'onBlur une priorité plus élevée?

Auparavant, au lieu d'utiliser le gestionnaire d'événements onMouseDown, nous avions l'événement onclick. Cependant, cela posait un certain nombre de problèmes en particulier en raison de la nature mono-thread de JavaScript.

+0

Cela dépend du navigateur. – voyager

+0

Certainement c'est. Il est toujours difficile d'écrire du code sur plusieurs navigateurs. Cependant, nous pouvons sans risque faire l'hypothèse que nous visons IE. Ce qui est également étrange, c'est que lorsque je remplace l'onmousedown par l'événement onclick, alors que seul le gestionnaire d'événement onblur est appelé et que cela fonctionne, le gestionnaire onclick n'est pas appelé quand je suis sur un champ avec le ensemble d'événements onblur. Avec l'onmousedown nous sommes presque là mais l'événement onblur se déclenche après l'onmousedown qui n'est pas ce que nous voulons. – user164701

+0

Je pense que mousedown puis flou est assez standard dans ce cas. Souvenez-vous qu'un gestionnaire d'événements onmousedown peut renvoyer false, auquel cas le changement de focus ne se produit pas. onclick devrait généralement fonctionner; peut-être afficher le code qui ne fonctionne pas là? – bobince

Répondre

0

Catch event #2, feu event #1. Puis laissez event #2 passer.

.. modèle Catch-and-release :)

+0

Merci beaucoup. Pouvez-vous fournir un exemple simple ou un pointeur pour plus d'informations à ce sujet? – user164701

+0

@roosteronacid, que se passe-t-il si un seul des événements se produit? Appelles-tu toujours la méthode du corps? – PanCrit

0

Vous devrez simuler en utilisant une variable d'état. C'est un peu sale, mais ça marche: la viande de doImportantStuff ne sera exécutée qu'une seule fois.

var importantStuffDone = false; 
function doImportantStuff(){ 
    if(!importantStuffDone){ 
      // Do something important 
      importantStuffDone = true; 
    } 
} 

function doOnBlur(){ 
    // This function gets bound to the blur event 
    doImportantStuff(); 
    // Do other blur stuff 
} 
function doOnMouseDown(){ 
    // This function gets bound to the mousedown event 
    doImportantStuff(); 
    // Do other mousedown stuff 
} 
+0

Merci beaucoup. J'ai obtenu votre solution, mais ce que nous voulons, c'est que l'onBlur soit toujours appelé avant d'appeler l'événement onmousedown. Donc, l'essentiel de la question est plus sur la modification de la priorité ou la priorité de gestion des événements Javascript. – user164701

+0

Vous ne pouvez pas; et même si vous le pouviez, l'implémentation de systèmes d'événements par les anciens navigateurs est si différente qu'elle finirait par casser quelque chose d'autre. Le mieux que vous puissiez faire est de feindre, comme ça. –

Questions connexes