2017-06-15 3 views
0

ウィンドウからイベントを削除するのに苦労しているのですが、なぜ動作しないのかわかりません。 私はウィンドウにイベントを追加する機能を持っています。イベントがウィンドウから削除されない

Test.prototype.func1 = function(){ 
    this.func2 = function(){ 
     // do something 
    }; 

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

は今、私は私が窓から私のイベントを削除していたにdetachEvent()を呼び出していたところから、(私はその特定のタブを終了するときに呼び出される)exit機能を持っています。

Test.prototype.exit = function(){ 
    this.detachEvent(); 
} 

そして、私のdetachEvent機能は、私のコードは、より大きなプロジェクトの一部であり、何とかfunc1回呼び出されているので、今、問題が発生し

Test.prototype.detachEvent() = function(){ 
    window.removeEventListener("event1", this.func2, true); 
} 

です。したがってevent1がウィンドウに2回追加されています。 だから私も

Test.prototype.func1 = function(){ 
    this.func2 = function(){ 
     // do something 
    } 
    this.detachEvent(); 
    window.addEventListener("event1", this.func2, true); 
} 

のようなウィンドウにイベントを追加する前にdetachEvent()を呼び出してみました。しかしdetachEvent()func1()内部から呼び出さなっているときにイベントが削除取得されていないが、detachEvent()が呼び出さ取得されたときに作業している重複イベントを持っていないとexit()から

私のコードは、イベントが2回追加されない場合に機能しますが、ここでは機能しません。 私はその理由を理解することができず、どんな助けも高く評価されます。

答えて

0

イベントを1回だけ追加する場合は、フラグを設定して再追加しないようにする必要があります。何かのようなもの。

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

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

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

あなたのデタッチリリースでは、そのフラグを解除してください。私は、問題は「this.func2が」あなたは何度も何度関数「func1の」を呼び出すときに、それだけで再「Test.prototype.func1」の内側に割り当てられている見ることができます

あなたのコードを見てみると
+0

こんにちは@Austio、これは問題なく動作します。提案していただきありがとうございます。しかし、これは問題のための一種の回避策です。しかし、私はなぜdetachEvent()を呼び出すのか、初めて正確になぜイベントが削除されないのだろうと思っていました。それが病気です。しかし、提案に感謝します。 – Max

1

何度も何度も '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ハンドラを削除する必要があります。 detachEventfunc1から呼び出すときに既に上書きされているため、イベントハンドラに影響を与えずに、インストールされていない関数を削除しようとします。

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

あるいは、func1内部func2を割り当てないが、コンストラクタで一度プロパティを初期化(あるいはそのプロトタイプ方法作ります)。そうすれば、addEventListener同じ関数を2回登録することさえありません。

関連する問題