Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
普通Javascript对象可以有事件吗?_Javascript_Object_Events - Fatal编程技术网

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

普通Javascript对象可以有事件吗?,javascript,object,events,Javascript,Object,Events,普通Javascript对象是否可以附加事件?说这样的话: obj = new Object(); obj.addEventListener('doSomething', foo, true); 我知道我可以用jQuery来实现这一点,但是不需要任何库就可以了吗?否。addEventListener是DOM的一个特性,而不是JS。我想你会发现,在普通JavaScript中,只有DOM对象可以有事件。否,不能将事件处理程序添加到任何对象中。不过,如果您正在为其他脚本编写某种类型的API或库以便与

普通Javascript对象是否可以附加事件?说这样的话:

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

我知道我可以用jQuery来实现这一点,但是不需要任何库就可以了吗?

否。
addEventListener
是DOM的一个特性,而不是JS。

我想你会发现,在普通JavaScript中,只有DOM对象可以有事件。

否,不能将事件处理程序添加到任何对象中。不过,如果您正在为其他脚本编写某种类型的API或库以便与之交互,则可以为对象编写自己的事件系统。

不是直接编写,而是向其中任何一个脚本添加所需的
发布/订阅
基础结构。

但是,您可以通过编写
addEventListener
和其他函数并存储每个事件的处理程序列表来实现自己的实现

例如:(未经测试)

函数addEventListener(名称、处理程序){
如果(!this.events)this.events={};
如果(!this.events[name])this.events[name]=[];
this.events[name].push(处理程序);
}
函数removeEventListener(名称、处理程序){
如果(!this.events)返回;
如果(!this.events[name])返回;
对于(var i=this.events[name].length-1;i>=0;i--)
if(this.events[name][i]==handler)
this.events[name].splice(i,1);
}
函数raiseEvent(名称、参数){
如果(!this.events)返回;
如果(!this.events[name])返回;
对于(var i=0;i
不,JavaScript对象只有属性。这些属性的值可能是:

  • 原始值
  • 对象(包括函数对象)

您可以定义addEventListener方法来收集所有侦听器对象,您的代码可以随时调用它们。这只是面向对象编程。定义addXListener,将作为参数传递的对象添加到某处,当发生某些事情时,调用它的方法

但请记住,UI事件是由HTML/Javascript定义的事件,因此您将只为“obj”对象编写程序,以提醒您的事件

举例来说:

FunnyProcessor
+ addStartListener(...)
+ addProcessingListener(...)
+ addEndListener(...)
+ doStuff()

doSuff将首先调用开始侦听器,然后执行一些循环,并为每个迭代调用处理侦听器,最后调用结束侦听器。

您必须为此实现自己的功能,但这并不困难

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');
    }
};
var obj={
事件:{},
addEventListener:函数(事件名称、处理程序){
if(!(此.events中的eventName))
this.events[eventName]=[];
this.events[eventName].push(处理程序);
},
raiseEvent:函数(eventName,args){
var currentEvents=this.events[eventName];
如果(!currentEvents)返回;
对于(var i=0;i
最近,这实际上是可能的

然而,它并没有惊人的浏览器支持。请参阅此图的“EventTarget()构造函数”部分:

或者查看此图表,其中仅包含相关行:

在这两种情况下,您所需要做的就是让类扩展EventTarget,并确保在构造函数中调用
super()
。完成后,您可以分派和侦听DOM对象上的事件

示例代码:

class EventDispatcher extends EventTarget {
    constructor() {
        super();
    }

    dispatch_event() {
        this.dispatchEvent(new Event("important-notification"));
    }
}

const event_dispatcher = new EventDispatcher();

event_dispatcher.addEventListener("important-notification", function() {
    console.log("Something important happened!");
});

event_dispatcher.dispatch_event();

我知道。这就是我为什么说“像……”之类的话的原因谁会称这种事件为行动?是的。。。这么多,这么快!谢谢大家@Gumbo说您可以拥有类似xmpp库的东西,并且可以触发该库/对象上的事件(如“已连接”、“已断开连接”等)。您希望在事件发生时执行一些操作。。。这就是我询问事件的原因。浏览器无法在本机上执行此操作,但是,您可以使用来执行此操作。只是把它放在这里给任何一个碰上它的人。是的。没那么难。但我想确定我必须这么做。谢谢这个代码不起作用<代码>!此中的eventName。事件
应为
!(此.events中的eventName)
@LuisVasconcellos:正确。编辑。谢谢。这是一项比我自己更为坚实的工作,因此为此+1。具体来说,您可以从DOM级别2事件中获得实现
EventTarget
接口的对象上的事件。这包括来自DOM的
元素
文档
,还包括
窗口
XMLHttpRequest
WebSocket
;也许我更忘了。你的有趣的处理器让我想起一个可观察的。。。这篇文章是从2010年开始的,在它很酷之前是可以观察到的。
class EventDispatcher extends EventTarget {
    constructor() {
        super();
    }

    dispatch_event() {
        this.dispatchEvent(new Event("important-notification"));
    }
}

const event_dispatcher = new EventDispatcher();

event_dispatcher.addEventListener("important-notification", function() {
    console.log("Something important happened!");
});

event_dispatcher.dispatch_event();