2013-07-09 19 views
5

我最近將JQuery升級到版本1.9。在1.4版本中,我正在做這樣的事情:如何獲取JQuery 1.9中的所有窗口事件?

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

當然,在jQuery的1.8移除這種能力。經過一番研究,我發現了一個建議,爲解決此獲得:

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

但是,根據控制檯的WindowEvent是不確定的。我究竟做錯了什麼?還有其他建議嗎?

感謝提前:)

+0

這是否工作'$(window).data('__ events __');'? – tymeJV

+2

我不會編寫依賴未公開的功能的代碼,例如事件處理程序存儲在特定的位置。 –

+0

你是否將任何處理程序綁定到窗口? –

回答

0

他們仍然存儲在同一個地方。但它僅存儲已綁定的事件,並且僅在至少綁定了一個事件之後(否則將返回undefined)。

所以,你必須改變你的病情

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

似乎對我$._data工作,如果事件處理程序綁定:

$(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

我結束了包括檢查是否定義了windowEvents。另外,我在詢問事件時包括了[0](這裏找到了這個解決方案:jQuery 1.8 find event handlers)。因此,最終的代碼如下所示:

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

現在,它的功能與升級前相同。謝謝你的幫助!

+2

這很好,但是你真的不應該用jQuery封裝窗口,只是爲了讓本地窗口返回'[0]',就像在我的例子中一樣,窗口和代碼完全一樣,只是更乾淨。 – adeneo

1

我找到解決方案上http://dbj.org/dbj/2013/04/09/list-of-jquery-events/

它的基礎是:

/* (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 ; 
} 

要使用它,只要致電:

jQuery.events("div"); 

凡格爲任何jQuery選擇的地方。我已經在jQuery 1.9上試過了,它對我來說工作得非常好。

相關問題