我很难从窗口删除事件,但我无法弄清楚它为什么不起作用。 我有一个函数,我在窗口中添加一个事件。
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
被添加到窗口两次。
所以为了没有重复的事件,我甚至尝试在将事件添加到窗口之前调用detachEvent()
,如
Test.prototype.func1 = function(){
this.func2 = function(){
// do something
}
this.detachEvent();
window.addEventListener("event1", this.func2, true);
}
但是当从detachEvent()
内部调用func1()
时,事件不会被删除,但是当从exit()调用detachEvent()
时它正在工作。
我的代码适用于未添加两次事件但在此处无效的情况。 我无法弄清楚原因,任何帮助将不胜感激。
答案 0 :(得分:1)
查看你的代码我可以看到问题是' 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
}
答案 1 :(得分:1)
您需要删除旧的detachEvent
处理程序。当您从func1
调用Test.prototype.func1 = function() {
this.detachEvent(); // move here!
this.func2 = function(){ … };
window.addEventListener("event1", this.func2, true);
}
时,您已经覆盖了它,因此它会尝试删除一个从未安装的函数,而不会影响事件处理程序。
func2
或者,不要在func1
内分配addEventListener
,而是在构造函数中初始化属性一次(或者甚至使其成为原型方法)。这样,dt.loc[dt['Frequency']=='0','Date']=dt['Time Period']+'01-01'
dt:
Frequency,Time Period,Date
0,2008
0,1961
2,2015Q1
3,2016M1
甚至不会两次注册相同的函数。
答案 2 :(得分:0)
如果您只希望一次添加事件,则需要设置一个标志以防止再次添加该事件。像。的东西。
Test.prototype.func1 = function(){
if (this._func2added) return;
this._func2added = true;
this.func2 = function(){
// do something
}
window.addEventListener("event1", this.func2, true);
}
在你的分离上释放了旗帜。
答案 3 :(得分:0)
将侦听器更改为您的操作:
旧:
youobject.addeventListener('something',unknownfunction);
使用这个更好:
youobject.event1 = function {
//you code here
}
这会自动清除并设置监听器。