侦听器之前的jQuery触发器

jQuery trigger before listener

本文关键字:jQuery 触发器 侦听器      更新时间:2023-09-26

使用$(document).ready();,您可以在dom准备好后执行它,但它仍然会激发。

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

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

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

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

但很明显,这不会触发,因为它是在听众就位之前触发的。

在被绑定之前触发事件当然不会有任何效果。

只有在附加了一些处理程序之后才应该触发它,否则不会触发任何内容。关于就绪事件,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.应该有更好的方法。