如何在jQuery或普通javascript中添加额外的事件处理程序?

如何在jQuery或普通javascript中添加额外的事件处理程序?,javascript,jquery,function,extending,Javascript,Jquery,Function,Extending,我有自己的带有onShow()函数的对象,在显示对象时(由我)调用。我可以通过赋值重写此函数 o.onShow = function() { // something }; 但它删除了函数的早期版本。因此,如果我希望保留现有的处理程序,我应该缓存它并调用新的处理程序: o.oldOnShow = o.onShow; o.onShow = function() { this.oldOnShow(); // something }; 但这样我只能缓存一个以前的处理程序。如果有很多呢 有没有一种方

我有自己的带有
onShow()
函数的对象,在显示对象时(由我)调用。我可以通过赋值重写此函数

o.onShow = function() { // something };
但它删除了函数的早期版本。因此,如果我希望保留现有的处理程序,我应该缓存它并调用新的处理程序:

o.oldOnShow = o.onShow;
o.onShow = function() { this.oldOnShow(); // something };
但这样我只能缓存一个以前的处理程序。如果有很多呢


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

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

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

这会将事件处理程序添加到事件处理程序列表中,但不会覆盖现有的处理程序

在jQuery中,您可以添加任意数量的处理程序:

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

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

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

如果希望在本机JavaScript中实现这一点,则需要使用字符串连接:

o.onShow = o.onShow + "function() { // something };"
如果需要触发自定义事件(如您在中定义的),则应调用
.trigger()
方法(只要您觉得应该触发该事件):

然后使用
.bind()
或(如果使用的是jQuery 1.7+)
.on()
,定义一个或多个侦听器:


如果你想用vanilla js来实现这一点,它会稍微有点棘手

const justLog=x=>()=>console.log(x)
const test=justLog('调用测试')
const testTwo=justLog('testTwo已调用')
document.querySelector('button').onclick=testTwo

Test
这是否只适用于jquery集的任何javascript对象?@Dims:see.Wow!这不是比硬编码慢吗?我不知道你说的硬编码是什么意思。。。当然,字符串连接事件处理程序不是理想的解决方案-最好通过jQuery附加处理程序+
$(o).trigger('my-awesome-event');
$(o).on('my-awesome-event', function(event){ ... });