Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 将事件侦听器作为Class.prototype函数删除_Javascript_Oop_Dom Events - Fatal编程技术网

Javascript 将事件侦听器作为Class.prototype函数删除

Javascript 将事件侦听器作为Class.prototype函数删除,javascript,oop,dom-events,Javascript,Oop,Dom Events,我试图在我的项目中有一个基于Class.prototype的类,在这里我没有内联函数。考虑到这个例子,不可能删除类中的myVideovideo对象上的eventListener 这是一个理论上的例子,不是我的实际生产代码 是否有办法将处理程序保留为Class.prototype函数并添加和删除侦听器。我需要实例化和创建大量此类对象,并且担心内存泄漏和对象持久性(以前创建的所有对象都会收到“结束”事件),因为匿名函数不会作为事件处理程序删除 或者我应该考虑一种不同的方法(内联函数,在初始化函数内部

我试图在我的项目中有一个基于Class.prototype的类,在这里我没有内联函数。考虑到这个例子,不可能删除类中的
myVideo
video对象上的eventListener

这是一个理论上的例子,不是我的实际生产代码

是否有办法将处理程序保留为Class.prototype函数并添加和删除侦听器。我需要实例化和创建大量此类对象,并且担心内存泄漏和对象持久性(以前创建的所有对象都会收到“结束”事件),因为匿名函数不会作为事件处理程序删除

<>或者我应该考虑一种不同的方法(内联函数,在初始化函数内部,作为事件处理程序)。这些确实会影响可读性和一致性,因此我想不惜一切代价避免它们。

您需要将函数
放在myvideoend
的上下文中:

例如:

this.myVideoEndedHandler = this.onMyVideoEnded.bind(this);
this.myVideo.addEventListener("ended", this.myVideoEndedHandler, false);
要删除侦听器,请同时使用存储的处理程序:

this.myVideo.removeEventListener("ended", this.myVideoEndedHandler, false);
这是因为当事件触发您的函数时,
onmyvideoend
出错
参数。

我使用此参数:

this.element.handler=handler.bind(this);
this.element.removeEventListener('event',this.element.handler,false);
this.element.addEventListener('event',this.element.handler,false);
或使用WeakMap对象:

var handlers=newweakmap();
var self=this;
set(this.element,{handler:handler.bind(self)});
var handler=handlers.get(this.element).handler;
this.element.removeEventListener('event',handler,false);
this.element.addEventListener('event',handler,false);

处理程序是一个侦听器,对吗?我真的不理解你的问题…处理程序是一个函数,当事件触发时get将被执行。侦听器是一种语言构造,当[listener]检测到事件已触发时调用处理程序函数(我不确定事件侦听器在引擎盖下如何工作)。
foo.bind(bar)!=foo.bind(bar)
,您将无法正确删除事件侦听器,除非您存储对原始绑定侦听器的引用。这是一个优雅且非常直接的操作,尽管来自ActionScript背景的操作并不简单。我非常感谢你!我再一次感受到了生活的乐趣
this.myVideo.removeEventListener("ended", this.myVideoEndedHandler, false);