【问题标题】:Execute event handler in jquery if custom event already triggered如果自定义事件已经触发,则在 jquery 中执行事件处理程序
【发布时间】:2015-09-29 03:43:20
【问题描述】:

注意:我的问题中的所有事件 pub-sub 都是通过 jQuery 的 on()/trigger()

我的应用程序中有一个模块(称为 Header),它会在某个时间点触发自定义事件('Header:init')。此事件将仅触发一次。

应用程序中的许多其他模块订阅此事件。如果在附加处理程序之前触发了 'Header:init' 事件,我希望这些模块中的事件处理程序能够执行。否则,处理程序按预期执行(一旦 'Header:init' 被触发)。

我希望我清楚我的要求 - 该功能很像 jQuery 的标准“就绪”事件 - 如果 DOM 准备好,处理程序在附加后立即执行,否则在 DOM 准备好后执行。

重申一下,'Header:init' 只触发一次。

我该怎么做?为此,我不希望任何变量在应用程序中浮动。寻找一个干净的解决方案 - 最好是准备事件的工作方式。我检查了 jQuery 站点是否有 jQuery 为此提供的任何事件挂钩,但一切都以浏览器事件为中心,如点击等,而没有自定义事件。

欣赏任何类型的指针。


编辑:明确说明需求...

时间 x : 订阅 Header:init 事件的某些模块具有以下代码,现在正在执行...

$( document ).on( 'Header:init', function() { /* 处理程序 */ ... });

时间 x + 1 :假设 Header 模块现在触发了事件(即稍后的时间点)

$(document).trigger('Header:init');

我的要求是应该仍然执行处理程序。

【问题讨论】:

  • “希望我清楚我需要什么” 不完全;在问题的这一部分:“如果在附加处理程序之前触发了 'Header:init' 事件,是否希望这些模块中的事件处理程序执行”?在附加了哪些处理程序之前?可以在问题中包含js 吗?
  • "Time x + 1 :假设 Header 模块现在触发了事件(即稍后的时间点) $( document ).trigger( 'Header:init' ); 我的要求是处理程序仍应被执行。” 处理程序没有被js 尝试过吗?可以创建stacksn-ps来演示吗?

标签: jquery events publish-subscribe


【解决方案1】:

尝试在 handler 处用定义命名函数代替匿名函数,以调用命名函数作为不同对象的处理程序

$(document).ready(function() {
// handler for `Header:init` namespace
var handleEvents = function handleEvents(e, msg) {
  $("div").html(msg)
};
// trigger `Header:init` handler `handleEvents` on `document` object
// at `document` ready event 
$(this).on("Header:init", handleEvents)
.trigger("Header:init", [this.nodeName]);
// trigger `handlerEvents` on `"header"` selector , or `document` at `click` event
$("header").on("click", function() {
  // $(document).trigger("Header:init")
  $(this).trigger("Header:init", [this.nodeName])
});
  
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<header>click</header>
<div></div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多