Javascript 我如何定义一个一次性事件,以便即使在事件已经发生之后,新的处理程序也会触发(一次)?

Javascript 我如何定义一个一次性事件,以便即使在事件已经发生之后,新的处理程序也会触发(一次)?,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,你知道这是怎么回事吗 $(function() { ... }); 无论“文档准备就绪”事件是否已经发生,都将触发?我想定义一个这样的事件 该事件是jQuery中的一个特例。我想知道自定义事件是否可以以相同的方式运行,只使用标准的事件机制 理想情况下,我希望能够以“正常”的方式定义处理程序: 如果在触发init.mything之前运行上述操作,则此功能现在可以工作。但如果没有,则处理程序永远不会运行 让这变得棘手的是,除了jQuery已经加载之外,我不想假设任何东西 有什么想法吗?我不确定是否

你知道这是怎么回事吗

$(function() { ... });
无论“文档准备就绪”事件是否已经发生,都将触发?我想定义一个这样的事件

该事件是jQuery中的一个特例。我想知道自定义事件是否可以以相同的方式运行,只使用标准的事件机制

理想情况下,我希望能够以“正常”的方式定义处理程序:

如果在触发
init.mything
之前运行上述操作,则此功能现在可以工作。但如果没有,则处理程序永远不会运行

让这变得棘手的是,除了jQuery已经加载之外,我不想假设任何东西


有什么想法吗?

我不确定是否所有的jQuery插件编码都正确,但我认为这个基本结构应该适合您:

;(function ($) {
     $.fn.initMyThing(fn) {
         if (this.data('mything_init')) {
             fn.apply(this);
         } else {
             this.on("init.mything", function() {
                 $(this).data('mything_init', true);
                 fn.apply(this);
         }
     }
 })(jQuery);
这意味着您必须使用语法

$(selector).initMyThing(function() ...);

而不是
.on()
来建立处理程序。document.ready如此工作的唯一原因是jQuery特别对待它。

您无法捕获绑定前触发的事件。您可能希望在定义处理程序后尝试显式触发事件,并使用布尔值检查它是否已在响应之前触发。谢谢回复。我认为唯一的答案是在客户端代码中加入类似的内容。如果这是插件的一部分,那么假设它已经运行与假设init事件已经完成(在本例中,init事件是同步的)实际上是一样的。好吧,我试着让它更通用,因为它使用
.data()
为绑定它的每个元素保持单独的状态。我很感激。最后,我在我的对象本身上添加了一个
isReady
标志,这样测试就更简洁了,但是您的版本可以在不修改lib的情况下工作。
$(selector).initMyThing(function() ...);