2010-07-19 113 views
17

我想使用獨立於DOM元素的自定義jQuery事件,但我不確定實現此目的的最佳方式是什麼。jQuery中的全局自定義事件

這裏就是我開始了:

// some system component registers an event handler 
$().bind("foo.bar", handler); // foo is my app's namespace, bar is event name 
// another part of the system fires off the event 
$().trigger("foo.bar", { context: "lorem ipsum" }); 

看着jQuery的源之後,特別是其處理全局AJAX事件,我想這應該工作:

$.fn.bind("foo.bar", handler); 
// ... 
$.event.trigger("foo.bar", { context: "lorem ipsum" }); 

然而,似乎我的處理函數從來沒有被調用過。

我可能會以這種錯誤的方式去做?

+0

它實際上是「」,請參閱http://docs.jquery.com/Namespaced_Events – MyGGaN 2010-09-14 08:50:07

+0

我認爲這個問題對於這個問題是有用的http://tdanemar.wordpress.com/2010/01/19/global -events-with-jquery/ – 2013-04-11 06:26:15

回答

32

如果您使用的是jQuery >1.4,那麼$()會返回一個空的jQuery集合,這意味着沒有事件處理程序實際上與任何東西綁定。在1.4之前,它將返回與jQuery(document)相同的值。

這可能是更好的只是有一個全局命名空間(一個實際的對象),然後添加事件到:

var FOO = {}; 

$(FOO).bind("foo.bar", handler); 

$(FOO).trigger("foo.bar", { context: "lorem ipsum" }); 
+1

我還沒有意識到你可以/應該圍繞一個普通的對象來包裝jQuery,但這很好,甚至可能意味着我不需要命名空間事件名稱(作爲事件綁定到特定對象已經可以防止衝突)。謝謝! – AnC 2010-07-19 09:46:18

+6

需要記住的一件事是,儘管我們可以將事件綁定到任何JavaScript對象,但我們無法使用「解除綁定」將其刪除。需要爲此使用'removeData'。 – Anurag 2010-07-19 16:31:20

+1

我不知道!將需要找到一個好的資源來閱讀它... – AnC 2010-07-19 17:16:29

3

我找到了這裏,因爲我一直在尋找使用來實現發佈/訂閱模式命名空間自定義事件使用jQuery。雖然接受的解決方案是以不與DOM元素綁定的方式使用$ .event.trigger()的方法,但它對於發佈者/訂戶體系結構中的真正全局事件實現(例如使用複雜的用戶界面與許多異步操作),你想要任意對象/元素監聽自定義事件。

通過實驗,我發現爲什麼AnC的事件沒有被觸發的真正答案是因爲jQuery顯然不允許「。」。 (週期)字符在自定義事件名稱中...但下劃線似乎是確定的。因此,如果您將事件命名爲foo_bar(而不是foo.bar),那麼您的代碼應該按預期工作。使用jQuery 1.4.4進行測試。

編輯:只是要清楚 - 我的意思是,如果你想使用$ .event.trigger()機制,那麼句點不允許用於自定義事件。在事件被對象或元素觸發的情況下,週期似乎是確定的......不確定這是一個錯誤還是設計。

+0

聽起來有趣 - 你有鏈接解釋$ .event.trigger的無DOM使用嗎?你可能也想把這個問題報告給jQuery人員,讓他們決定它是否是一個bug。自從我開始研究替代方案 - PubSubJS看起來很棒(很小):http://roderick.dk/blog/2010/10/12/introducing-pubsubjs-a-library-for-doing-publish-subscribe-在JavaScript的/ – AnC 2010-11-18 08:41:15