jQuery同步触发自定义事件?

Mig*_*elo 11 jquery sync javascript-events

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

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

custom-event有很多添加到它的听众.就好像触发方法不同步,允许window.location.href在执行事件之前进行更改.当window.location.href被更改时,会发生导航,中断所有内容.

如何同步触发事件?

使用jQuery 1.8.1.

谢谢!

编辑

我发现事件被调用时有一个像这样的堆栈跟踪:

  1. jQuery.fx.tick(jquery-1.8.1.js:9021)
  2. tick(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)

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

Tre*_*ent 23

你,我的朋友,正在寻找jQuery"when".

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

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

$.when($(this).trigger('custom-event')).done(function(){
    window.location.href = 'url';
});
Run Code Online (Sandbox Code Playgroud)

  • 实际上我错了......`trigger`是同步的...问题是在触发事件中有一个效果运行,并且在回调中调用了预期的方法. (6认同)
  • "*如果将一个参数传递给`jQuery.when`且它不是Deferred或Promise,它将被视为已解决的Deferred,并且所有附加的doneCallbacks将立即执行.*"和[`trigger`]( http://api.jquery.com/trigger/)**不会**返回此类. (6认同)
  • 其实没有.http://api.jquery.com/trigger/显示jQuery.trigger()返回有问题的jQuery对象,即$(this); 据我所知,没有办法将Promise返回到事件触发器调用. (2认同)
  • @RaúlFerràs完全正确。在这里使用`$ .when`是完全错误的。 (2认同)

jeh*_*hon 9

阅读有关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';
Run Code Online (Sandbox Code Playgroud)

会满足你的要求.

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