2012-02-09 34 views
2

我有我自己的对象,onShow()函数,这个函数在显示对象时被我调用。我可以通过赋值覆盖此功能如何在jQuery或纯javascript中添加其他事件处理程序?

o.onShow = function() { // something }; 

但它删除了以前版本的函数。所以,如果我要保护现有的处理程序,我应该缓存,并在新的处理程序调用:

o.oldOnShow = o.onShow; 
o.onShow = function() { this.oldOnShow(); // something }; 

可是这样一来,我可以缓存只有一个以前的处理程序。如果它们中有很多呢?

有没有一种方便的方法来完成这项任务?这项任务如何在文献中被命名?有没有在jQuery中的这种方法?

回答

4

如果需要触发定制事件(如由您定义),你应该叫该.trigger()方法(每当你觉得该事件应触发):

$(o).trigger('my-awesome-event'); 

然后你定义一个或多个接收器,即使用.bind()或者(如果你使用jQuery 1.7+) .on()

$(o).on('my-awesome-event', function(event){ ... }); 
+0

这是否适用于仅针对jQuery集的任何JavaScript对象? – Dims 2012-02-09 15:17:15

+0

@Dims:请参阅http://www.mrspeaker.net/2009/10/28/using-jquery-on-javascript-objects/。 – rsenna 2012-02-09 15:32:04

2

您可以使用jQuery的绑定方法:

$(o).bind("show", function() {}); 

这增加了一个事件处理的事件处理程序的列表,不会覆盖现有的处理程序。 Here are the docs

+0

尽可能简单! – 2012-02-09 15:00:05

5

在jQuery中,只要你喜欢,你可以添加尽可能多的处理程序:

$(o).on('show', function() { ... }); 

后续调用将不会删除以前绑定的处理程序。

+0

请注意,jQuery on方法需要jQuery 1.7+ – 2012-02-09 15:21:36

1

只要事件处理程序不会阻止事件传播,通过jQuery附加事件处理程序不会与任何其他事件发生冲突。

如果您想做到这一点在原生的JavaScript,你需要使用字符串连接:

o.onShow = o.onShow + "function() { // something };" 
+0

哇!这不是比硬编码慢吗? – Dims 2012-02-09 15:18:25

+0

我不确定硬编码是什么意思......字符串连接事件处理程序当然不是所需的解决方案 - 通过jQuery附加处理程序将是更可取的。 – jbabey 2012-02-09 15:31:21