Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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 对自定义类的addEventListener.call(ob,…)的非法调用_Javascript_Events_Dom Events_Addeventlistener - Fatal编程技术网

Javascript 对自定义类的addEventListener.call(ob,…)的非法调用

Javascript 对自定义类的addEventListener.call(ob,…)的非法调用,javascript,events,dom-events,addeventlistener,Javascript,Events,Dom Events,Addeventlistener,我在addEventListener.call(ob)上遇到非法调用错误。以下是我的示例代码: 函数MyClass(名称){ var target=document.createTextNode(空); this.addEventListener=target.addEventListener.bind(目标); this.removeEventListener=target.removeEventListener.bind(目标); this.dispatchEvent=target.dis

我在
addEventListener.call(ob)
上遇到非法调用错误。以下是我的示例代码:

函数MyClass(名称){
var target=document.createTextNode(空);
this.addEventListener=target.addEventListener.bind(目标);
this.removeEventListener=target.removeEventListener.bind(目标);
this.dispatchEvent=target.dispatchEvent.bind(目标);
this.MyName=name;
this.ModifyName=函数(newName){
this.MyName=newName;
此事件(新事件(“变更”));
};
}
MyClass.prototype=EventTarget.prototype;
函数changeHandler(){
log(`From changeHandler`);
}
函数changeHandler2(){
log(`From changeHandler2`);
}
功能测试(){
var ob=新的MyClass(“OrgName”);
ob.addEventListener(“变更”,变更处理程序);

addEventListener.call(ob,“Change”,function(){changeHandler()});//上面的注释只是猜测代码失败的原因

尽管幸运的是所有其他代码气味都不会导致抛出错误,但是
test()
(在代码示例的第30行)中最大的错误是调用
addEventListener.call(ob,“Change”,function(){changeHandler()});

调用是非法的,因为它将欺骗绑定的上下文。调用失败是因为
全局
窗口
对象不等于
ob
。如果调用例如
ob.addEventListener.call(ob,“Change”,changeHandler2);
一切都很好,因为上下文仍然指向相同的引用

函数MyClass(名称){
var target=document.createTextNode(空);
this.addEventListener=target.addEventListener.bind(目标);
this.removeEventListener=target.removeEventListener.bind(目标);
this.dispatchEvent=target.dispatchEvent.bind(目标);
this.MyName=name;
this.ModifyName=函数(newName){
this.MyName=newName;
此事件(新事件(“变更”));
};
}
MyClass.prototype=EventTarget.prototype;
函数changeHandler(){
log(`From changeHandler`);
}
函数changeHandler2(){
log(`From changeHandler2`);
}
功能测试(){
var ob=新的MyClass(“OrgName”);
ob.addEventListener(“变更”,变更处理程序);
//允许,因为上下文仍以相同引用为目标。
ob.addEventListener.call(ob,“Change”,changeHandler2);
//-不允许,因为它试图欺骗绑定上下文。。。
//…它失败,因为'global'或'window'对象不等于'ob'。
//
////addEventListener.call(ob,“Change”,function(){changeHandler()});
console.log(ob.MyName);
ob.修改名称(“更新名称”);
console.log(ob.MyName);
}
test();

.as控制台包装{最小高度:100%!重要;顶部:0;}
您无法将事件侦听器添加到文本节点。请将文本包装在span或其他内容中。您也不能在类上调用它。
addEventListener
属于DOM元素。感谢@peter seliger的响应。1.“class”将无法与旧浏览器一起使用,对吗?2.我实际上已经为XmlHttpRequest创建了代理类,该类可以在pt所有ajax请求/响应。在angular开始使用addEventListener.call(xhr,“readystatechange”,callback)之前,它工作正常。在这里,xhr是我的代理类的对象。我对angular代码没有任何控制权。我只能修改我的代理类。@Hitesh…也许你可以通过将上一个提到的用例浓缩到另一个方便的代码示例中,将此新信息添加到原始问题中。@Hitesh…提供了代理xhr实现的最重要部分对于理解代码实际失败的位置和方式/原因仍然有很大帮助。当addEventListener.call订阅readystatechange事件时,代码失败(xhr,“readystatechange”,callback)。在这里,xhr是代理对象。对我来说,这听起来像是要截取任何xhr方法的数据流。代理不是完成此任务的唯一方法。请打开另一个Q,并在那里提供所有必要的代码和信息。