有没有办法将事件绑定到某个对象,并确保其中一个事件将始终执行?
$('#something').bind('click', function () {
// do something first
});
$('#something').bind('click', function () {
// do this always last
});
$('#something').bind('click', function () {
// do this after first one
});
谢谢!
答案 0 :(得分:1)
您可以一次性绑定所有处理程序:
$('#something').click(function () {
first();
second();
third();
});
除了绑定3个独立的听众之外,它还具有更高效/轻量级的额外好处。
答案 1 :(得分:1)
编辑:这可能很有用,但可能无法解决OP的问题。在one
上触发的处理程序不会附加到当前处理程序队列的末尾,它仅在后续事件上运行。
对于未来的读者,您可以通过使用one()
代理处理程序来实现此目的。
$('.some-class').on('anevent', function(evt) {
$(this).one(evt.type, function(evt) {
//this code will fire after all other handlers for this event, except others that are proxied the same way
console.log(evtO == evt, 'same event');
if (evt.isDefaultPrevented())//can check signals to see whether you should still handle this event
return;
//do stuff last
});
})
稍后在其他地方:
$('.some-class').on('anevent', function(evt) {
//do stuff first
evt.preventDefault();//can signal to prevent the proxied function. could use evt.stopPropagation() instead
})
一个警告是,如果后来的处理程序使用return false;
或stopImmediatePropagation()
,则绑定到one()
的函数将在下次该事件时首先触发 发生,除非你以某种方式明确解除它。
答案 2 :(得分:0)
可能不是一个好的方法,但是我发现它非常有用。您可以不带任何参数使用setTimeout
。
$('#something').bind('click', function () {
setTimeout(function(){
// This will always execute at last
// Write your code here.
});
});
基本上setTimeout()
在执行队列的末尾重新排队该函数。