在jQuery中绑定事件,始终在最后执行

5

有没有一种方法可以将事件绑定到某个对象,并确保其中一个事件总是最后执行?

  $('#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个回答

4

这可能不是很好的方法,但我觉得它非常有用。您可以使用没有任何参数的setTimeout

$('#something').bind('click', function () {

  setTimeout(function(){
    // This will always execute at last
    // Write your code here.
  });
});

基本上,setTimeout()会在执行队列的末尾重新排列该函数。

这实际上是一个非常有用的技巧。我想知道它是否可以跨浏览器依赖? - clifgriffin
1
好的,我可以确认这在所有浏览器中都有效。我相信这实际上是jQuery处理事件的方式,而不是浏览器处理事件的方式,无论如何它在Safari、Chrome、Firefox、IE 11和IE 80(现在他们称之为什么)中都有效。这是一个fiddle:http://jsfiddle.net/Lpcqhsx1/ - clifgriffin

1

你可以一次性绑定所有的处理程序:

$('#something').click(function () {
    first();
    second();
    third();
});

这样做的额外好处是比绑定三个单独的监听器更有效率/轻量级。


1
更易于维护,而不是在不同的地方定义几个(呸!你真丢人!) - Wiseguy
问题在于我不知道有多少事件将绑定到#something元素。它可以是从1到x,我想确保一个特定的事件总是在最后执行,无论事件以哪种顺序绑定。 - Goran Radulovic
@Goran:“问题是我不知道有多少事件会绑定到#something元素。” 为什么呢?事件处理程序应该真正独立。无论如何,通常最好将监听器的数量最小化。 - Matt Ball
因为我正在构建复杂的Web应用程序,并且我想在整个Web应用程序中使用的所有<select>元素上处理一个事件。该处理程序需要最后触发,因为我希望允许其他处理程序绑定到同一元素。这些事件可以更改该元素的任何属性。在执行所有其他事件之后,我需要执行我的处理程序,它将执行所需的操作。 - Goran Radulovic

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()绑定的函数会在下一次事件发生时首先触发,除非你以某种方式明确地解除绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接