注意:我的问题中的所有事件pub-sub都是通过jQuery的on()/ trigger()
我的应用程序中有一个模块(称为Header),它在某个时间点触发自定义事件('Header:init')。此事件将被触发一次。
应用程序中的许多其他模块都订阅了此事件。如果在连接处理程序之前触发'Header:init'事件,我希望这些模块中的事件处理程序能够执行。否则处理程序按预期执行(一旦'Header:init'被触发)。
我希望我能清楚我需要的东西 - 功能很像jQuery的标准'ready'事件 - 如果DOM准备就绪,处理程序会在它们被附加时立即执行,否则它们会在DOM准备好后执行。
重申一下,'Header:init'只触发一次。
我该怎么做?我不希望任何变量浮动在应用程序周围。寻找一个干净的解决方案 - 最好是准备好的事件。我检查了jQuery网站上jQuery为此提供的任何事件挂钩,但是所有内容都集中在浏览器事件上,例如点击等,而没有用于自定义事件。
欣赏任何类型的指针。
编辑:明确说明要求......
时间x:订阅Header:init事件的某个模块下面有代码并立即执行...
$(document).on('Header:init',function(){/ *处理程序* / ... });
时间x + 1:假设Header模块现在触发了事件(即稍后的时间点)
$(document).trigger('Header:init');
我的要求是仍应执行处理程序。
答案 0 :(得分:0)
尝试在处理程序中为匿名函数替换定义的命名函数,以将命名函数作为不同对象的处理程序调用
$(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>