2017-06-15 74 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甚至不會註冊相同的函數兩次。