2009-10-04 63 views
3

我正在尋找一種方法來從我的jQuery插件派發事件,以便它可以有多個監聽器的事件。我有插件安裝程序,以便它可以返回對自身的引用,以便以後可以通過公共方法添加偵聽器。從多個監聽器的插件jQuery調度事件

我到目前爲止看到有一個單一的事件處理程序,例如,唯一的例子:

$.fn.foo = function(options) { 
    ... 
    // trigger event 
    options.eventHandler(); 
} 

$('#bar').foo({ eventHandler: myEventHandler }) 

是什麼,我會盡我唯一的選擇,只需註冊的事件處理的數組,並調用每個他們,還是我錯過了一個更好的選擇。

+0

好奇:你爲什麼試圖向一個事件添加多個監聽器? – roosteronacid 2009-10-05 10:50:32

+0

因爲當事件發生時,我希望發生多件事情,這是基於事件編程的核心優勢之一。例如,我可以添加儘可能多的偵聽器,因爲我想要一個點擊事件,並且他們都根據該事件完成他們自己的事情。 – DEfusion 2009-10-05 12:34:23

+0

有道理。我已經添加了答案。只是爲了關閉循環。 – roosteronacid 2009-10-05 15:03:03

回答

2

我會拋出一個數組放入構造函數/選項對象。這是它是如何正常進行:

$("").plugIn(
{ 
    prop: "value", 
    foo: "bar", 
    eventsToFire: [ 
     function() { }, 
     function() { }, 
     function() { } 
    ] 
}); 

和插件會做沿着此線的東西:

假設你正在寫這應該對集合執行的插件。

jQuery.fn.plugIn = function (options) 
{ 
    return this.each(function() 
    { 
     var i = options.eventsToFire.length; 

     while (i--) options.eventsToFire[i](); 
    }); 
}; 
+1

您可以通過在開始處遞減來縮短while語句,while(i--;){}' – 2009-10-05 15:09:04

+0

您是對的。漂亮漂亮:) – roosteronacid 2009-10-05 15:12:51

+0

是的,這是我所想的。唯一的區別是我在插件上有一個registerEventHandler方法,所以我可以稍後添加事件處理程序。 – DEfusion 2009-10-06 16:05:28

0

爲什麼不使用數組並通過它循環?下面的代碼將接受數組和單個事件處理程序。

$.fn.foo = function(options) { 
    ... 
    // trigger event 
    if(typeof eventHandler == "Array"){ 
     for(var i=0; i<eventHandler.length; i++){ 
     options.eventHandler[i](); 
     } 
    }else{ 
     options.eventHandler(); 
    } 
} 

$('#bar').foo({ eventHandler: [myEventHandler, anotherEventHandler] }) 
+0

是的,這是我在想什麼(雖然會有一個registerEventHandler方法,所以我可以稍後註冊處理程序),但我想知道是否有更好的(或者我應該說jQuery的標準/核心)替代。 – DEfusion 2009-10-05 12:35:17