jQuery中的绑定事件总是在最后执行

时间:2011-04-22 15:20:47

标签: bind jquery

有没有办法将事件绑定到某个对象,并确保其中一个事件将始终执行?

  $('#something').bind('click', function () {
    // do something first
  });
  $('#something').bind('click', function () {
    // do this always last
  });  
  $('#something').bind('click', function () {
    // do this after first one
  });

谢谢!

3 个答案:

答案 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()在执行队列的末尾重新排队该函数。