2017-06-15 81 views
0

我很难从窗口中删除事件,我无法弄清楚为什么它不工作。 我有一个函数,我将一个事件添加到窗口。事件没有从窗口中删除

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()。

我的代码适用于事件没有被添加两次但在这里不工作的情况。 我无法找出原因,任何帮助将不胜感激。

回答

0

如果您只希望事件被添加一次,您需要设置一个标志以防止它再次被添加。就像是。

Test.prototype.func1 = function(){ 
    if (this._func2added) return; 
    this._func2added = true; 

    this.func2 = function(){ 
    // do something 
    } 

    window.addEventListener("event1", this.func2, true); 
} 

并在您的分离版本上发布的标志。

+0

嗨@Austio,这使事情工作。感谢您的建议。但这是针对这个问题的一种解决方法。但我想知道为什么第一次我调用detachEvent(),事件不会被删除。那是这种疾病。但是,谢谢你的建议。 – Max

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 
} 
0

改变听众对你的行动:

老:

youobject.addeventListener('something',unknownfunction); 

使用,这是更好的:

youobject.event1 = function { 
    //you code here 
} 

这种自动清除,并设置监听器。

1

您需要删除旧的func2处理程序。当您从func1调用detachEvent时,您已经覆盖它,因此它会尝试删除从未安装的函数,而不会影响事件处理程序。

Test.prototype.func1 = function() { 
    this.detachEvent(); // move here! 
    this.func2 = function(){ … }; 
    window.addEventListener("event1", this.func2, true); 
} 

或者,不分配func2func1,但在构造函数初始化后的财产(甚至使之成为原型法)。这样,addEventListener甚至不会注册相同的函数两次。