jQuery是否同步触发自定义事件?

jQuery是否同步触发自定义事件?,jquery,javascript-events,sync,Jquery,Javascript Events,Sync,我正在使用jQuery触发器方法调用事件。。。但它的行为并不一致。有时它称之为事件,有时它不称之为事件 <a href="#" onclick=" $(this).trigger('custom-event'); window.location.href = 'url'; return false; ">text</a> 自定义事件添加了许多侦听器。 这就好像触发器方法是不同步的,允许在执行事件之前更改window.location.href

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

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

自定义事件
添加了许多侦听器。 这就好像触发器方法是不同步的,允许在执行事件之前更改
window.location.href
。当window.location.href更改时,会出现一个导航,从而中断一切

如何同步触发事件

使用jquery1.8.1

谢谢

编辑

我发现调用该事件时,其堆栈跟踪如下:

// Trigger the custom event
$(this).triggerHandler('custom-event');
// This code will only run when all events are run
window.location.href = 'url';
  • jQuery.fx.tick(jQuery-1.8.1.js:9021)
  • 勾选(jquery-1.8.1.js:8499)
  • jQuery.Callbacks.self.fireWith(jQuery-1.8.1.js:1082)
  • jQuery.Callbacks.fire(jQuery-1.8.1.js:974)
  • jQuery.speed.opt.complete(jQuery-1.8.1.js:8991)
  • $.customEvent(myfile.js:28)

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

    我的朋友,您正在寻找jQuery“when”

    要强制任何东西都是同步的,您可以使用这样的东西

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

    阅读关于triggerHandler的文档:

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

    文档中的这一点让我想到这样的代码:

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


    事实上我错了<代码>触发器是同步的。。。问题是触发的事件中运行了一个效果,并且在回调中调用了预期的方法。处理程序必须返回一个承诺;-)实际上没有。显示jQuery.trigger()返回有问题的jQuery对象,即$(this);据我所知,没有办法将承诺返回到事件触发器调用。“如果将单个参数传递到
    jQuery。当
    不是延迟或承诺时,它将被视为已解决的延迟,任何附加的doneCallbacks都将立即执行。”并且不会返回此类参数。@RaúlFerr恰恰如此。在这里使用
    $。当
    是完全错误的。这是真的。。。我的代码的问题出在我身上。=)在发布这个问题的时候,我没有看到事件中存在UI效果,代码只是从该UI效果的回调调用的,而不是由vent代码直接调用的。您可以使用它触发属于单独iFrame的事件的处理程序吗?换句话说,我可以让iframe同步通信,并在响应返回之前阻止进一步的代码被处理吗?@PerryMonschau我很确定javascript不能像iframe那样轻松通信。请看一下用于帧间通信的serviceWorker()。。。或者操纵iFrame的散列并观察从iFrame修改回来的散列。或者,选择一个浏览器插件。。。不管怎么说,没有简单的解决办法。。。