*これは、ターゲットクラスの子がイベントをトリガーできるように編集されました。詳細については、回答の下部を参照してください。*
アイテムが頻繁に追加および削除されるクラスにイベントリスナーを追加するための代替回答。これはon
、イベントがリッスンしている子要素のセレクターを渡すことができるjQueryの関数に触発されています。
var base = document.querySelector('#base'); // the container for the variable content
var selector = '.card'; // any css selector for children
base.addEventListener('click', function(event) {
// find the closest parent of the event target that
// matches the selector
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// handle class event
}
});
フィドル:https : //jsfiddle.net/u6oje7af/94/
これはbase
要素の子のクリックをリッスンし、クリックのターゲットにセレクターと一致する親がある場合、クラスイベントが処理されます。個々の要素にクリックリスナーを追加することなく、必要に応じて要素を追加および削除できます。これは、jQuery機能と同様に、このリスナーが追加された後に追加された要素であっても、それらすべてをキャッチします(内部的には多少似ていると思います)。
これは、伝播するイベントに依存するため、stopPropagation
他の場所でイベントに参加している場合、これは機能しない可能性があります。また、このclosest
関数にはIEとの互換性の問題があるようです(そうでないことは?)。
このタイプのアクションを繰り返し聞く必要がある場合は、これを関数にすることができます。
function addChildEventListener(base, eventName, selector, handler) {
base.addEventListener(eventName, function(event) {
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// passes the event to the handler and sets `this`
// in the handler as the closest parent matching the
// selector from the target element of the event
handler.call(closest, event);
}
});
}
=========================================
編集:この投稿はもともとmatches
関数を使用しましたイベントターゲットのDOM要素。ただし、これにより、イベントのターゲットが直接クラスのみに制限されました。closest
代わりに関数を使用するように更新され、目的のクラスの子のイベントでもイベントをトリガーできるようになりました。元のmatches
コードは元のフィドルで見つけることができます:https :
//jsfiddle.net/u6oje7af/23/