2

你可以在$(document).ready(); dom 准备好之后执行它,但它仍然会触发。

如何让自定义触发器以相同的方式运行?

IE

$(document).trigger("myEvent");

当页面加载时(在 myEvent 之前),我可能会延迟加载脚本,做一些 Ajax,当 Ajax 完成时(现在可能在 myEvent 之后),我会在 Ajax 回调中放置一个侦听器以确保 myEvent 像以前一样发生我继续(就像你对 $(document).ready() 所做的那样)

$(document).on("myEvent", function(){ ... });

但显然这不会触发,因为它是在侦听器到位之前触发的。

4

1 回答 1

0

绑定之前的触发事件当然是没有效果的。

只有在附加了一些处理程序之后才应该触发它,否则不会触发任何内容。关于 ready 事件,jQuery 为此使用了一个延迟对象,即“readyList”对象。但是我很确定它对于您正在寻找的东西来说只是过大,无论如何这仍然会根据其他事件触发,DOMContentLoaded 或 onreadystatechange 或窗口对象的 onload 或如果这些事件已经完成,则使用超时手动解决。

那么为什么不绑定后触发事件呢,经典的方式:

$(document).on("myEvent", function(){ /**/ }).trigger('myEvent');

如果出于某种原因您想在特定情况下触发它,并且由于模糊的原因您无法修改 ajax 回调方法来检查某些条件,您仍然可以使用 ajaxStop() 处理程序,如下所示:

$(document).ajaxStop(function () {
    if ($._data(document, 'events').myEvent) {
        $(this).trigger('myEvent').off('ajaxStop'); //off() could be removed, depending your needs
    }
}); 

演示

如果你想使用你的 ajax 方法返回的 promise 接口,使用类似的东西:

$.when($.get('myajax')).done(function(){$(document).trigger('myEvent')});

但实际上,你没有告诉我们你在寻找什么,也许你的逻辑在其他地方失败了,更好的方法应该是 IMO 可能的。

于 2013-07-26T09:05:55.740 回答