【问题标题】:jQuery trigger custom event synchronously?jQuery同步触发自定义事件?
【发布时间】:2012-10-31 13:37:56
【问题描述】:

我正在使用 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)

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

【问题讨论】:

    标签: jquery synchronization jquery-events


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 其实我错了...trigger是同步的...问题是在触发事件内部运行了一个效果,并且在回调内部调用了预期的方法。
    • 处理程序必须返回一个 Promise ;-)
    • 其实没有。 api.jquery.com/trigger 表明 jQuery.trigger() 返回有问题的 jQuery 对象,即 $(this);据我所知,没有办法将 Promise 返回给事件触发调用。
    • "如果将单个参数传递给jQuery.when,并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred,并且任何附加的 doneCallbacks 都将立即执行。" 而trigger返回这样的。
    • @RaúlFerràs 没错。在这里使用$.when 是完全错误的。
    【解决方案2】:

    阅读有关 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/

    【讨论】:

    • 那是真的......我的代码的问题是我。 =) 在发布这个问题时,我没有看到事件内部有 UI 效果,并且代码只是从该 UI 效果的回调中调用,而不是由通风代码直接调用。
    • 你能用它来触发属于单独 iFrame 的事件的处理程序吗?换句话说,我可以让 iFrames 同步通信,并防止在响应返回之前处理进一步的代码吗?
    • @PerryMonschau 我很确定 javascript 无法与 iframe 轻松通信。查看 serviceWorker (developer.mozilla.org/en-US/docs/Web/API/ServiceWorker) 以进行帧间通信......或者操作 iFrame 的哈希并观察从 iframe 修改回来的哈希。或者,去一个浏览器插件......无论如何,AFAIK 没有简单的解决方案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2012-10-09
    • 2013-06-16
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多