2012-11-12 196 views
7

我正在使用jQuery触发器方法来调用一个事件......但它的行为不一致。有时它称之为事件,有时不会。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方法是异步的。 (我错了......这只能证明我正在调用的事件,里面有一个动画,并且在动画之后调用回调函数中的预期函数)

回答

24

你,我的朋友,正在寻找jQuery “什么时候”。

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

要强求什么是同步的,你可以使用这样的事情....

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

+1:是的!那就是......谢谢! jQuery'触发器'文档没有提到这种延迟行为......即使它只是一个小小的延迟,有时会造成很大的麻烦。 –

+6

其实我错了......'trigger'是同步的......问题是在触发事件内部运行了一个效果,并且在回调中调用了预期的方法。 –

+1

处理程序必须返回一个Promise ;-) –

9

阅读文档中关于triggerHandler:

代替返回jQuery对象的(以允许链接),.triggerHandler()返回最后一个处理程序返回的任何值,它会导致执行。如果没有处理程序重新触发,它返回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/

+0

这是真的......我的代码的问题是我。 =)在发布这个问题时我没有看到事件内部存在UI效果,并且代码只是从该UI效果的回调中调用,而不是由通风代码直接调用。 –

+0

您可以使用它来触发属于单独iFrame的事件处理程序吗?换句话说,我可以让iFrames同步通信,并在响应返回之前阻止进一步处理代码吗? –

+1

@PerryMonschau我很确定,javascript不能像iframe那样与easilly进行通信。看看serviceWorker(https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker)进行帧间通信......或者操纵iFrame的散列并观察被修改的散列来自iframe。或者,去一个浏览器插件...无论如何,AFAIK不容易的解决方案... – jehon