2013-07-09 22 views
5

Gần đây tôi đã nâng cấp JQuery lên phiên bản 1.9. Trên phiên bản 1.4, tôi đã làm một việc như sau:Tôi làm cách nào để có được tất cả các sự kiện cửa sổ trong JQuery 1.9?

 var windowEvents = $(window).data("events"); 
    if (windowEvents.unload.length > 0) { 
      // some fun stuff 
    } 

Tất nhiên, trong jQuery 1.8 khả năng này đã bị xóa. Sau một số nghiên cứu, tôi đã tìm thấy một đề xuất để thực hiện việc này:

 var windowEvents = $._data($(window), "events"); 

Nhưng, theo bảng điều khiển, windowEvents không xác định. Tôi đang làm gì sai? Bất cứ một đề nghị nào khác?

Cảm ơn trước :)

+0

Công cụ này có hoạt động '$ (cửa sổ) .data ('__ events __');'? – tymeJV

+2

Tôi sẽ không viết mã dựa trên các tính năng không có giấy tờ, như trình xử lý sự kiện được lưu trữ ở một vị trí cụ thể. –

+0

Bạn đã gắn bất kỳ trình xử lý nào vào cửa sổ? –

Trả lời

0

Chúng vẫn được lưu trữ ở cùng một nơi. Nhưng nó chỉ lưu trữ các sự kiện đã bị ràng buộc và chỉ sau ít nhất một sự kiện bị ràng buộc (nếu không thì data() sẽ trả lại undefined).

Vì vậy, bạn sẽ phải thay đổi tình trạng của bạn

var windowEvents = $(window).data("events") || {}; 
if (windowEvents.unload && windowEvents.unload.length > 0) { 
     // some fun stuff 
} 
3

Dường như làm việc cho tôi với $._data nếu xử lý sự kiện là ràng buộc:

$(window).on('unload', function() { 
    // do stuff 
}); 

if (($._data(window, 'events').unload || []).length) { 
    console.log('unload is bound'); 
}else{ 
    console.log('unload is NOT bound'); 
} 

FIDDLE

1

tôi đã kết thúc trong đó có một kiểm tra xem windowEvents đã được xác định chưa. Ngoài ra tôi đã bao gồm [0] khi yêu cầu các sự kiện (giải pháp này được tìm thấy ở đây: jQuery 1.8 find event handlers). Vì vậy, mã cuối cùng trông giống như sau:

var windowEvents = $._data($(window)[0], "events"); 
if (windowEvents && windowEvents.unload.length > 0) { 
    // some fun stuff 
} 

Điều này hiện đang hoạt động như trước khi nâng cấp. Cảm ơn bạn đã giúp đỡ!

+2

Điều đó thật tuyệt, nhưng bạn thực sự không nên bọc cửa sổ trong jQuery chỉ để lấy lại cửa sổ gốc bằng '[0]', chỉ cần làm cửa sổ, như trong ví dụ của tôi, giống như mã của bạn, chỉ sạch hơn. – adeneo

1

tôi tìm thấy giải pháp trên http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

nó là cơ sở là:

/* (c) 2013 by DBJ.ORG, GPL/MIT applies */ 
jQuery.events = function (expr) { 
    var rez = [], evo ; 
    jQuery(expr).each(
     function() { 
     if (evo = jQuery._data(this, "events")) 
      rez.push({ element: this, events: evo }) ; 
    }); 
return rez.length > 0 ? rez : null ; 
} 

Để sử dụng nó chỉ cần gọi:

jQuery.events("div"); 

đâu div là nơi cho bất kỳ selector jquery. Tôi đã thử nó trên jQuery 1.9 và nó làm việc rất tốt cho tôi.

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