14

我正在使用 jQuery 触发器方法来调用事件......但它的行为不一致。有时它调用事件,有时它不调用。

<a href="#" onclick="
    $(this).trigger('custom-event');
    window.location.href = 'url';
    return false;
">text</a>

custom-event添加了很多听众。就好像触发方法不是同步的,允许window.location.href在执行事件之前进行更改。当 window.location.href 发生改变时,会发生导航,打断一切。

如何同步触发事件?

使用 jQuery 1.8.1。

编辑

我发现该事件在调用时具有如下堆栈跟踪:

  1. jQuery.fx.tick (jquery-1.8.1.js:9021)
  2. 勾选(jquery-1.8.1.js:8499)
  3. jQuery.Callbacks.self.fireWith (jquery-1.8.1.js:1082)
  4. jQuery.Callbacks.fire (jquery-1.8.1.js:974)
  5. jQuery.speed.opt.complete (jquery-1.8.1.js:8991)
  6. $.customEvent (myfile.js:28)

这证明了jQuerytrigger方法是异步的。(我错了......这只能证明我正在调用的事件,里面有一个动画,并且在动画之后在回调中调用了预期的函数)

4

2 回答 2

28

你,我的朋友,正在寻找 jQuery“何时”。

http://api.jquery.com/jQuery.when/

要强制任何东西同步,你可以使用这样的东西......

$.when($(this).trigger('custom-event')).done(function(){
    window.location.href = 'url';
});
于 2012-11-12T04:58:00.617 回答
11

阅读有关 triggerHandler 的文档:

.triggerHandler() 不是返回 jQuery 对象(以允许链接),而是返回它导致执行的最后一个处理程序返回的任何值。如果没有重新触发处理程序,则返回 undefined

文档中的这一点让我认为这样的代码:

// Trigger the custom event
$(this).triggerHandler('custom-event');
// This code will only run when all events are run
window.location.href = 'url';

会满足你的要求。

http://api.jquery.com/triggerHandler/

于 2013-04-18T08:46:26.263 回答