首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >普通的Javascript对象可以有事件吗?

普通的Javascript对象可以有事件吗?
EN

Stack Overflow用户
提问于 2010-01-18 23:15:55
回答 8查看 2.4K关注 0票数 19

普通的Javascript对象可以附加事件吗?像这样说:

obj = new Object();
obj.addEventListener('doSomething', foo, true);

我知道我可以用jQuery做到这一点,但是没有任何库也可以做到吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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');
    }
};
票数 11
EN

Stack Overflow用户

发布于 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;
票数 6
EN

Stack Overflow用户

发布于 2010-01-18 23:19:05

不是直接添加,而是向其中任何一个添加所需的publish/subscribe基础设施。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2086956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档