2010-10-09 39 views
5

Tôi muốn kiểm tra xem sự kiện có khả dụng hay không trước khi liên kết một chức năng với sự kiện đó. Vấn đề là Google Chrome hỗ trợ sự kiện "loadmetadata" trong phần tử Video trong khi FireFox thì không.Làm cách nào để kiểm tra xem trình xử lý sự kiện có tồn tại bằng jQuery hay JS không?

tôi đã làm như sau

$('video').bind('loadedmetadata', videoloaded); 
videoloaded(); 

Nó làm việc tốt trong Firefox nhưng khi tôi đã cố gắng trong Chrome, chức năng được thực hiện hai lần (đó là logic). Tôi muốn kiểm tra xem có loadedmetadata trình xử lý sự kiện tồn tại hay không để chạy hàm chỉ một lần trong mỗi trình duyệt.

Nếu khả năng như vậy không tồn tại, bất kỳ công việc thông minh nào xung quanh việc này?

Trả lời

5

Kiểm tra $video.data("events") nếu đối tượng này chứa sự kiện của bạn vì bạn đang sử dụng .bind tất cả các sự kiện của thành phần này sẽ được lưu trữ trong đối tượng này.

var $video = $("#video"); 
var $ve = $video.data("events"); 

// checking if a `loadedmetadata` object exists in `data("events")` 
if ($ve != null && typeof($ve.loadedmetadata) !== undefined) 
{ 
    // has loadedmetadata event 
} 

Full làm việc example on jsFiddle

+0

@ Peter: Tôi đã thêm một ví dụ về nó làm việc trên jsFiddle. – BrunoLM

+0

@Bruno - Tôi hơi bối rối hơn bây giờ khi tôi bắt đầu: ( –

+1

@Peter: Giả sử anh ta luôn sử dụng jQuery để ràng buộc các sự kiện, có nghĩa là tất cả các eventhandler được lưu trữ trên 'element.data (" events ")'. là một đối tượng chứa một số đối tượng, trong đó các đối tượng chứa thông tin về sự kiện, ví dụ sự kiện 'x' trên một phần tử,' element.data ("events") 'sẽ trả về:' ({x: [{handler: (function() {}), dữ liệu: (void 0), không gian tên: "", gõ: "x", guid: 31}]}) ' – BrunoLM

Các vấn đề liên quan