普通的Javascript对象可以附加事件吗?像这样说:
obj = new Object();
obj.addEventListener('doSomething', foo, true);
我知道我可以用jQuery做到这一点,但是没有任何库也可以做到吗?
发布于 2010-01-18 23:22:48
为此,您必须实现自己的功能,但这并不是很难。
var obj = {
events: {},
addEventListener: function(eventName, handler) {
if(!(eventName in this.events))
this.events[eventName] = [];
this.events[eventName].push(handler);
},
raiseEvent: function(eventName, args) {
var currentEvents = this.events[eventName];
if(!currentEvents) return;
for(var i = 0; i < currentEvents.length; i++) {
if(typeof currentEvents[i] == 'function') {
currentEvents[i](args);
}
}
},
click: function() {
// custom 'click' function. when this is called, you do whatever you
// want 'click' to do. and then raise the event:
this.raiseEvent('onClick');
}
};
发布于 2010-01-18 23:19:12
不是的。
但是,您可以通过编写addEventListener
和其他函数并存储每个事件的处理程序列表来实现自己的实现。
例如:(未测试)
function addEventListener(name, handler) {
if (!this.events) this.events = {};
if (!this.events[name]) this.events[name] = [];
this.events[name].push(handler);
}
function removeEventListener(name, handler) {
if (!this.events) return;
if (!this.events[name]) return;
for (var i = this.events[name].length - 1; i >= 0; i--)
if (this.events[name][i] == handler)
this.events[name].splice(i, 1);
}
function raiseEvent(name, args) {
if (!this.events) return;
if (!this.events[name]) return;
for (var i = 0; i < this.events[name].length; i++)
this.events[name][i].apply(this, args);
}
var obj = ...;
obj.addEventListener = addEventListener;
obj.removeEventListener = removeEventListener;
obj.raiseEvent = raiseEvent;
发布于 2010-01-18 23:19:05
不是直接添加,而是向其中任何一个添加所需的publish/subscribe
基础设施。
https://stackoverflow.com/questions/2086956
复制相似问题