【发布时间】:2012-03-31 13:47:42
【问题描述】:
我正在尝试创建一个自定义 javascript EventManager 类。我采用了 Grant Skinner 在他的 easel.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]
【问题讨论】:
-
listners 被清除为数组,但您将其用作哈希表。 apply 将数组作为第二个参数,但您正在为它提供一个字符串。为什么在 addListener 上需要 .call?它现在的编写方式是你希望“fire”在函数内部。您以一种非常奇怪的方式使用 IIFE,您根本不需要最顶层的功能。除此之外,您的代码应该可以工作。
-
Ilya - 什么是 IIFE?感谢您指出我混淆了数组和哈希表。您如何以我需要的方式在 javascript 中声明哈希表?当您说我根本不需要最顶层的功能时,您的意思是什么?再次感谢:)
-
我知道这个问题已经很老了,但我写了一个小 (1kb) 库,它让自定义事件的生活变得更加轻松:源代码和 API 可以在我的博客文章中找到:pointsoftware.ch/de/…
标签: javascript events event-handling dom-events javascript-framework