編集可能な複数のコンテンツを保持できるページがあります。コンテンツを編集するたびに何らかのチェックイベントを発生させたいこれを達成するためのremoveEventlistenerが矢印の関数とパラメータで正常に動作しない
私のコードは次のようになります。
// Find all editable elements.
let allEditableElements = document.querySelectorAll('[contenteditable="true"]');
for(let i = 0; i < allEditableElements.length; i++){
//Remove eventListener to prevent duplicate events.
allEditableElements[i].removeEventListener('input', (event) => {myClass.myEventMethod(event);}, false);
// Add event.
allEditableElements[i].addEventListener('input', (event) => {myClass.myEventMethod(event);}, false);
}
すべては、これまで正常に動作します。しかし、私はユーザーがコンテンツを編集できると述べました。これには、編集可能な新しいコンテンツをページ自体に追加することも含まれます。その時点でイベントが再度設定されるため、事前にevent
を削除しようとしています。
私の質問は、なぜremoveEventListener
機能が期待どおりに機能しないのですか?そして、そのように与えられたイベントに名前を付ける方法はありません:私はいくつかの研究を行なったし、コード自体は次のように働くだろうということが分かった。もちろん、
// With eventNameGivenByUser an event could be removed just by its name. addEventListener('eventTriggerName', 'eventNameGivenByUser', function(), [, options]);
:
// Find all editable elements.
let allEditableElements = document.querySelectorAll('[contenteditable="true"]');
for(let i = 0; i < allEditableElements.length; i++){
//Remove eventListener to prevent duplicate events.
allEditableElements[i].removeEventListener('input', myClass.myEventMethod, false);
// Add event.
allEditableElements[i].addEventListener('input', myClass.myEventMethod, false);
}
しかし、これはパラメータを渡すことなく、このような動的セットアップで必須です...
希望者は、2017年にライブラリを使用しないでいいとまともな方法があると言います。
編集2017年2月8日:興味があるだけのもののために
: ソリューションは、リスナーに任意のパラメータを渡さないことです。
// as you can see there is no (event) and no arrow function either.
addEventListener('input', myClass.myEventMethod, false);
は、すべての今しています次のようなメソッドを用意して呼び出すことです:
// The Parameter will be passed through anyway!
myEventMethod(event) {
/**
* Do stuff with event parameter.
*/
};
その後、リスナーがそのように取り外すことができます。
removeEventListener('input', myClass.myEventMethod, false);
追記:
私は電子を使用していますし、クロスブラウザのサポートを必要としません。 Chromium: 56.0.2924.87
と互換性があります。
よろしく、Megajin
問題は明白ですが、ソリューションを提供するために現実世界のコードが必要です。特にこれは:_ "これはパラメータを渡すことなし" _問題のコードはパラメータを渡しません。よりよいアプローチが問題を完全に排除することは言うまでもない。 – zeroflagL
@zeroflagLもちろん、リスナーを新しく作成した要素に追加する代わりに、リスナーをすべて実行するという問題を解決できます。 'element.hasEvent()'のような良い方法があるのなら、私はちょっと不思議でした。 – Megajin