我正在尝试创建一个自定义的 javascript EventManager 类。我采用了 Grant Skinner 在他的 essel.js 框架中使用的格式来创建类,并且需要坚持使用它。我现在真的迷失了 - 我认为 - 至少在概念意义上 - 我在这里有正确的想法,而且主要是范围问题回避了我。
我希望这里有人可以帮助我让 addListener 和dispatchEvent 发挥作用。
[code]
(function(window) {
var EventManager = function() {
this.initialize();
}
var p = EventManager.prototype;
// place properties here
// Constructor
p.initialize = function() {
p.listeners = new Array();
}
// public methods
p.addListener = function(fn, event) {
console.log("p.addListener Hit");
console.log("event: " + event);
console.log("handler function: " + fn);
if(!this.listeners[event]) {
this.listeners[event] = [];
}
if(fn instanceof Function) {
this.listeners[event].push(fn);
}
return this;
}
p.dispatchEvent = function(event, params) {
console.log("Dispatch Event");
// loop through listeners array
for(var index = 0; index < listeners[ev].length; index++) {
// execute matching 'event' - loop through all indices and
// when ev is found, execute
listeners[event][index].apply(window, params);
}
}
p.removeListener = function(event, fn) {
// split array 1 item after our listener
// shorten to remove it
// join the two arrays back together
}
window.EventManager = EventManager;
}(window));
[/code]
[code]
<script>
eventManager = new EventManager();
var FooTest = function() {
this.fire = function() {
//alert("fire");
}
this.fire();
};
function onFire() {
// console.log("FIRED!");
}
var o = new FooTest();
eventManager.addListener.call("fire", onFire );
// eventManager.dispatchEvent.call(o,'fire' );
</script>
[/code]
最佳答案
这是固定代码的工作示例:http://jsfiddle.net/JxYca/3/
您的代码大部分工作正常,只是偶尔出现一些小问题。 IFFE 是立即调用函数表达式 (IIFE)。这就是您对整个函数(窗口){}(窗口)所做的事情。但在这种情况下,这是绝对没有必要的,只会污染代码。 javascript 中没有哈希表这样的东西,但是,您可以使用对象来代替它。属性的名称成为键,它们的值现在是哈希表的值。
虽然对你来说是一个额外的、有点无关的东西。这种处理事件的方式很好,但如果你有 3 个处理程序附加到一个事件,而第二个处理程序因 JavaScript 异常而失败,那么第三个处理程序将永远不会被执行。您可能想快速了解一下prototype.js 是如何处理事件的:https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/event.js他们的事件是非阻塞的。
关于javascript - 自定义 Javascript EventManager - 请帮我完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713187/