2010-08-13 6 views
9

Ich habe Ereignis Feuer Reihenfolge zwischen Browsern untersucht, weil unsere Anwendung ein ungewöhnliches Verhalten auftritt.Reihenfolge der Änderung/keydown/keypress Ereignisse in jQuery

Ich habe einen kleinen Test erstellt, um die Reihenfolge der drei Ereignisse zu sehen: Änderung, Keydown und Tastendruck. Hier

ist die 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> 

Hier ist die 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"); 
    }); 
}); 

Wenn ich Buchstabe f in das Textfeld eingeben, drücken Sie die Eingabetaste die folgenden in Internet Explorer, ich 8:

Ergebnisse

  • Key nach unten
  • Key drücken
  • ändern
  • Key nach unten
  • Key drücken

Aber in Firefox (3.6.8), erhalte ich folgendes:

Ergebnisse

  • Taste
  • Key drücken
  • Key nach unten
  • Key drücken
  • ändern

Die Reihenfolge der Änderungsereignis ist bedeutsam, da wir die Enter-Taste in dem Ereignis KeyDown aufnimmst, aber einige Validierung mit der zu tun Ändern Sie das Ereignis.

Ich habe mich umgesehen, konnte aber das Problem nicht identifizieren.
Ist das erwartete Verhalten? Sollten alle Browser jQuery-Ereignisse in einer bestimmten Reihenfolge auslösen? Oder sollten wir alle Annahmen für die Reihenfolge der Ereignisauslösung entfernen? Oder gibt es etwas anderes, das mir in die Quere kommt?

+1

Ich bin überrascht, dass das keine Antworten hat noch, wie ich es als interessantes Verhalten hätte gedacht, durch IE. Vielleicht hat IE zu viel interessantes Verhalten. – Russell

+1

Ich kann bestätigen, dass sich IE9 in dieser Hinsicht genauso verhält wie IE8. – nickf

Antwort

3

Ich konnte nichts im Internet über dieses spezifische Szenario finden, außer dass Ereignisreihenfolge nicht etwas ist, das bei der Implementierung von Browsern angenommen werden sollte.

Das führt mich dazu, die Annahme zu entfernen, dass die Änderungsmethode immer nach onkeydown kommt, und muss meinen Validierungs-/Übergabeprozess mit dieser Überlegung entwerfen.

Im Grunde werde ich Validierung/Übergabe in eine Methode verschieben und sie von beiden Ereignissen aufrufen, aber stellen Sie sicher, dass sie nur einmal aufgerufen wird, mit einem Flag.

Wenn jemand irgendwelche zusätzlichen Informationen/Ratschläge dazu hat, wäre das großartig.:)

+1

Mit jQuery 'one' -Funktion sollte es möglich sein, ohne ein Flag zu triggern, da das Ereignis nur einmal ausgelöst wird. –

1

Ich weiß, die Frage ist alt, aber ich endete tun dies in einer ähnlichen Situation wie OP up:

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