事件没有从窗口中删除
我很难从窗口中删除事件,我无法弄清楚为什么它不工作。 我有一个函数,我将一个事件添加到窗口。事件没有从窗口中删除
Test.prototype.func1 = function(){
this.func2 = function(){
// do something
};
window.addEventListener("event1", this.func2, true);
};
现在我有一个exit
功能(当我离开那个特定的标签被称为),从那里我打电话detachEvent()
,其中我从窗口删除我的事件。
Test.prototype.exit = function(){
this.detachEvent();
}
而且我detachEvent
功能
Test.prototype.detachEvent() = function(){
window.removeEventListener("event1", this.func2, true);
}
现在问题出现了,因为我的代码是一个更大的项目的一部分,并以某种方式func1
被称为两次。所以event1
被添加到窗口两次。 所以不存在重复事件中,我甚至尝试添加事件的窗前,仿佛
Test.prototype.func1 = function(){
this.func2 = function(){
// do something
}
this.detachEvent();
window.addEventListener("event1", this.func2, true);
}
但当detachEvent()
正从里面func1()
称为是没有得到删除事件之前调用detachEvent()
,但它是当detachEvent()
获取调用工作从exit()。
我的代码适用于事件没有被添加两次但在这里不工作的情况。 我无法找出原因,任何帮助将不胜感激。
如果您只希望事件被添加一次,您需要设置一个标志以防止它再次被添加。就像是。
Test.prototype.func1 = function(){
if (this._func2added) return;
this._func2added = true;
this.func2 = function(){
// do something
}
window.addEventListener("event1", this.func2, true);
}
并在您的分离版本上发布的标志。
看你的代码,我可以看到的问题是“this.func2”在“Test.prototype.func1”分配,这样,当你调用函数“FUNC1”一遍又一遍,它只是重新一次又一次地分配'func2'。解决这个问题的最好办法是,
FUNC1
Test.prototype.func1 = function(){
this.detachEvent();
window.addEventListener("event1", this.func2, true);
}
出口
Test.prototype.exit = function(){
this.detachEvent();
}
detachEvent
Test.prototype.detachEvent = function(){
window.removeEventListener("event1", this.func2, true);
}
FUNC2
Test.prototype.func2 = function(){
// do something
}
改变听众对你的行动:
老:
youobject.addeventListener('something',unknownfunction);
使用,这是更好的:
youobject.event1 = function {
//you code here
}
这种自动清除,并设置监听器。
您需要删除旧的func2
处理程序。当您从func1
调用detachEvent
时,您已经覆盖它,因此它会尝试删除从未安装的函数,而不会影响事件处理程序。
Test.prototype.func1 = function() {
this.detachEvent(); // move here!
this.func2 = function(){ … };
window.addEventListener("event1", this.func2, true);
}
或者,不分配func2
内func1
,但在构造函数初始化后的财产(甚至使之成为原型法)。这样,addEventListener
甚至不会注册相同的函数两次。
嗨@Austio,这使事情工作。感谢您的建议。但这是针对这个问题的一种解决方法。但我想知道为什么第一次我调用detachEvent(),事件不会被删除。那是这种疾病。但是,谢谢你的建议。 – Max