2010-08-13 5 views
9

J'ai étudié l'ordre de tir d'événement entre les navigateurs, parce que notre application rencontre un comportement inhabituel.Ordre de changement/événements keydown/keypress dans jQuery

J'ai créé un petit test pour voir l'ordre des trois événements: changement, keydown et keypress.

Voici le code HTML (test.html):

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script> 
     <script src="test.js"></script> 
    </head> 
    <body> 

     <input type="text" id="TextBox" /> 
     <input type="button" id="Button" value="Clear Results"/> 

     <hr /> 

     <table id="ResultTable" style="width: 100px"> 
      <tr><th>Results</th></tr> 
     </table> 
    </body> 

</html> 

Voici la JS (test.js):

/* 
    Appends event information to display table. 
*/ 

$(document).ready(function() { 
    $("#TextBox").change(function() { 
     $("<tr><td>Change</td></tr>").appendTo("#ResultTable"); 
    }); 

    $("#TextBox").keydown(function() { 
     $("<tr><td>Key down</td></tr>").appendTo("#ResultTable"); 
    }); 

    $("#TextBox").keypress(function() { 
     $("<tr><td>Key press</td></tr>").appendTo("#ResultTable"); 
    }); 

    $("#Button").click(function() { 
     $("#ResultTable").empty(); 
     $("<tr><th>Results</th></tr>").appendTo("#ResultTable"); 
    }); 
}); 

Lorsque je tape la lettre f dans la zone de texte, puis appuyez sur Entrée , je reçois ce qui suit dans Internet Explorer 8:

Résultats

  • clé vers le bas
  • presse clé
  • Changement
  • clé vers le bas
  • appuyer sur la touche

Mais dans Firefox (3.6.8), je reçois le texte suivant:

Résultats

  • Clé en bas
  • presse clé
  • touche vers le bas
  • presse clé
  • changement

L'ordre de l'événement de changement est important que nous saisissons la touche entrée dans l'événement KeyDown, mais faire une validation avec le changer d'événement. J'ai regardé autour de moi, mais je n'ai pas pu identifier l'origine du problème.
Est-ce que ce comportement est attendu? Tous les navigateurs doivent-ils déclencher les événements jQuery dans un ordre spécifique? Ou devrions-nous supprimer toutes les hypothèses pour l'ordre de déclenchement de l'événement? Ou y a-t-il autre chose qui m'empêche de penser?

+1

Je suis surpris cela n'a pas encore de réponse que je l'aurais pensé comme un comportement intéressant par C'EST À DIRE. Peut-être que IE a trop de comportement intéressant. – Russell

+1

Je peux confirmer que IE9 se comporte comme IE8 à cet égard. – nickf

Répondre

3

Je n'ai pas trouvé de détails sur le net à propos de ce scénario spécifique, mis à part le fait que cet ordre d'événement ne devrait pas être pris en compte dans l'implémentation des navigateurs. Cela m'amène à enlever l'hypothèse que la méthode de changement viendra toujours après onkeydown, et devra concevoir mon processus de validation/soumission avec cette considération.

Fondamentalement, je vais déplacer validation/submit dans une méthode, et l'appeler à partir des deux événements, mais assurez-vous qu'il est seulement appelé une fois, en utilisant un drapeau.

Si quelqu'un a des informations supplémentaires/conseils sur ce qui serait génial.:)

+1

L'utilisation de la fonction jquery 'one' devrait vous permettre de déclencher sans avoir à utiliser un drapeau, puisque l'événement n'est déclenché qu'une seule fois. –

1

Je sais que la question est vieux, mais je fini par faire cela dans une situation similaire à l'OP:

$("#my_form").one("change keypress", ":input", ask_user_to_save_before_leaving);