2010-08-13 54 views
9

Tôi đã điều tra lệnh ngăn chặn sự kiện giữa các trình duyệt, vì ứng dụng của chúng tôi đang gặp phải một số hành vi bất thường.Thứ tự thay đổi/phím tắt/nhấn phím trong jQuery

Tôi đã tạo một thử nghiệm nhỏ để xem thứ tự của ba sự kiện: thay đổi, nhấn phím và nhấn phím.

Dưới đây là 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> 

Đây là 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"); 
    }); 
}); 

Khi tôi gõ chữ f vào textbox, sau đó nhấn enter , tôi nhận được sau trong trình duyệt Internet Explorer 8:

Kết quả

  • chính xuống
  • báo chí chính
  • Thay đổi
  • chính xuống
  • báo chí chính

Nhưng trong Firefox (3.6.8), tôi nhận được như sau:

Kết quả

  • Nhập phím
  • .210
  • chính báo chí
  • chính xuống
  • báo chí chính
  • Thay đổi

Thứ tự của các sự kiện thay đổi có ý nghĩa khi chúng ta đang nắm bắt được nhập quan trọng trong sự kiện KeyDown, nhưng làm một số xác nhận với thay đổi sự kiện.

Tôi đã có một cái nhìn xung quanh, nhưng không thể xác định được vấn đề ở đâu.
Hành vi này có được mong đợi không? Tất cả các trình duyệt có nên kích hoạt các sự kiện jQuery theo một thứ tự cụ thể không? Hoặc chúng ta có nên xóa tất cả các giả định cho thứ tự bắn sự kiện không? Hay có điều gì khác đang diễn ra theo cách tôi không nghĩ đến?

+1

Tôi ngạc nhiên này không có câu trả lời nào như tôi đã có thể nghĩ nó như là hành vi thú vị bằng I E. Có thể IE có quá nhiều hành vi thú vị. – Russell

+1

Tôi có thể xác nhận rằng IE9 hoạt động giống như IE8 trong lĩnh vực này. – nickf

Trả lời

3

Tôi không thể tìm thấy bất kỳ chi tiết nào trên mạng về trường hợp cụ thể này, ngoài thứ tự sự kiện đó không phải là thứ nên được giả định trong việc triển khai trình duyệt.

Điều này dẫn tôi loại bỏ giả định rằng phương thức thay đổi sẽ luôn xuất hiện sau onkeydown và sẽ phải thiết kế quy trình xác thực/gửi của tôi với việc xem xét này.

Về cơ bản tôi sẽ di chuyển xác thực/gửi vào một phương pháp và gọi nó từ cả hai sự kiện, nhưng hãy đảm bảo nó chỉ được gọi một lần, sử dụng cờ.

Nếu có ai có thêm thông tin/lời khuyên nào về điều này sẽ tuyệt vời.:)

+1

Sử dụng chức năng jquery 'one' sẽ cho phép bạn kích hoạt mà không phải sử dụng cờ, vì sự kiện chỉ được kích hoạt một lần. –

1

Tôi biết câu hỏi là cũ, nhưng tôi đã kết thúc làm điều này trong một tình huống tương tự như OP:

$("#my_form").one("change keypress", ":input", ask_user_to_save_before_leaving); 
Các vấn đề liên quan