2012-03-16 80 views
3

我知道無法綁定到所有DOM事件,我知道您可以通過提供空格分隔列表綁定到多個事件。如何綁定到jQuery中的所有自定義事件

但是有可能綁定到所有的自定義事件(最好通過像'abc *'或名稱空間通配符模式進行過濾)?

編輯: 爲了澄清,我創建了一些自定義小部件來響應某些自定義事件。例如,他們都處理名爲「stepReset」的事件並重置其內部模型。

在我寫完這些之後,我意識到事件不會冒泡,因此致電$(body).trigger('stepReset')基本上什麼都不做。因此,我正在考慮在所有小部件的父元素上添加一個傘事件處理程序,以傳播所有相關事件。

(我知道這是不是一個完美的解決方案,但我忘了有一個共同的類來標記處理程序的元素,所以有使用其全部選中沒有簡單的方法。)

回答

7

至於你即將到來的編輯,您可以通過訪問對象的數據檢索所有必然事件:

var boundEvents = $.data(document, 'events'); 

在這裏,您可以遍歷產生的對象,檢查每個屬性爲您所選擇的通配符,或者遍歷該屬性的數組元素和檢查各自的namespace財產。

例如,

$.each(boundEvents, function() { 
    if (this.indexOf("*")) // Checks each event name for an asterisk * 
     alert(this); 

    // alerts the namespace of the first handler bound to this event name 
    alert(this[0].namespace); 
}); 

如果我理解正確的你, 可以遍歷特殊事件對象獲取的自定義事件列表(包括那些在jQuery的源代碼中指定) 。下面是一個ES5例如,你需要將它自己適應舊的瀏覽器,或使用a polyfillObject.keys

var evts = Object.keys(jQuery.event.special).join(" "); 
$("#myDiv").on(evts, function (e) { 
    // your code here 
}); 
+0

在雖然結合通配符或一個特定的命名空間而言,我猜他不得不超負荷'觸發( )'並手動將觸發的事件與'jQuery.event.special'的屬性進行比較? – Matt 2012-03-16 10:40:46

+0

@Matt:或者編寫一個自定義函數來在綁定時過濾特殊事件。 – 2012-03-16 10:43:17

+1

哎呀,但似乎自定義事件[不要添加到'jQuery.event.special'](http://jsfiddle.net/E8ue2/)(至少在1.7.1):( – Matt 2012-03-16 10:47:51