2017-11-05 2 views
0

は、それは前に数回を頼まれていますが、すべては自分の私が見てどちらかがそれをされない、または何らかの理由removeEventListenerが機能していませんか?

フォーカス取得時のために働くしていないようです試したが入力したときに、それが発火するコールバックを取りますキーが押されている(それほどうまくいく)が、removeEventListener()を呼び出すと動作しないようです。私は、宣言の代わりに関数を変数にしようとしましたが、追加/削除の両方に対してuseCaptureフラグを設定しようとしましたが、関数引数または関数自体のいずれかに.bind(this)を試してみました。 removeEventListener()行を別の場所(setTimeout()の前後)に置くこともできますが、利用できません。イベントリスナーが持続(とdivに蓄積)またはすべてのいくつかの試行

MyConsole.prototype.onEnter = function(callback) { 
    const callCallback = function(e) { 
     e.preventDefault(); 
     if (e.keyCode === 13 && typeof callback === "function") { 
      setTimeout(function() { 
       callback(); 
      }.bind(this), 0); 
      this.textAreaInputDiv.removeEventListener("keyup", callCallback.bind(this), true); 
     } 
    } 
    this.textAreaInputDiv.addEventListener("keyup", callCallback.bind(this), true); 
} 

に任意のヘルプは、ヘラはあなたがにまったく同じ関数を渡す必要があります

+0

どのようにKeyEventのために非常に多くのリスナーに来ますか? 1つのイベントに対して1つのeventListenerを使用し、それを複数回使用するDOM内のすべてのものに委譲します。ドキュメントへの添付はkeyCode13に適しています – zer00ne

答えて

1

をいただければ幸いで追加されますしていないようだいずれかaddEventListenerremoveEventListenerの両方。

MyConsole.prototype.onEnter = function(callback) { 
    const callCallback = function(e) { 
     e.preventDefault(); 
     if (e.keyCode === 13 && typeof callback === "function") { 
      setTimeout(function() { 
       callback(); 
      }.bind(this), 0); 
      this.textAreaInputDiv.removeEventListener("keyup", callCallbackBound, true); 
     } 
    }; 

    const callCallbackBound = callCallback.bind(this); 

    this.textAreaInputDiv.addEventListener("keyup", callCallbackBound, true); 
}; 

は、実際にはarrow functionit does not have its own this以来、ここでより良いオプションになります。

そして、あなたはおそらくsetTimeoutcallback.bind(this)を意味ので、私もこれを修正するために自分自身を聞かせて:

MyConsole.prototype.onEnter = function(callback) { 
    const callCallback = (e) => { 
     e.preventDefault(); 
     if (e.keyCode === 13 && typeof callback === "function") { 
      setTimeout(callback.bind(this), 0); 
      this.textAreaInputDiv.removeEventListener("keyup", callCallback, true); 
     } 
    }; 

    this.textAreaInputDiv.addEventListener("keyup", callCallback, true); 
}; 
関連する問題