2009-10-04 65 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