動的に生成されたすべての要素にイベントリスナー(Javascript)を追加できますか?私はページの所有者ではないため、静的な方法でリスナーを追加することはできません。
ページのロード時に作成されたすべての要素について、私は次を使用します。
doc.body.addEventListener('click', function(e){
//my code
},true);
ページに新しい要素が表示されたときにこのコードを呼び出すメソッドが必要ですが、jQueryを使用できません(プロジェクトでデリゲート、オンなどが機能しません)。これどうやってするの?
図書館に戻ることなく、委任戦略を追求する必要があるようです。 Fiddle here: http://jsfiddle.net/founddrama/ggMUn/ にサンプルコードを投稿しました
その要点は、target
オブジェクトのevent
を使用して、関心のある要素を探し、それに応じて応答することです。何かのようなもの:
document.querySelector('body').addEventListener('click', function(event) {
if (event.target.tagName.toLowerCase() === 'li') {
// do your action on your 'li' or whatever it is you're listening for
}
});
CAVEATS!例Fiddleには、標準に準拠したブラウザ(IE9 +など)のコードのみが含まれます他の全員のバージョン)「古いIE」attachEvent
をサポートする必要がある場合は、適切なネイティブ関数の周りに独自のカスタムラッパーも提供する必要があります(これについては多くの良い議論があります) ; Nicholas Zakasが彼の本で提供しているソリューションが気に入っていますWeb開発者向けのプロフェッショナルなJavaScript。)
新しい要素を追加する方法に依存します。
createElement
を使用して追加する場合、これを試すことができます:
_var btn = document.createElement("button");
btn.addEventListener('click', masterEventHandler, false);
document.body.appendChild(btn);
_
その後、masterEventHandler()
を使用してすべてのクリックを処理できます。
jQuery.on()
に似た、動的イベントリスナーを追加する小さな関数を作成しました。
Element.matches()
メソッドを使用してターゲットが指定されたセレクター文字列と一致するかどうかを確認するだけで、受け入れられた答えと同じ考え方を使用します。
addDynamicEventListener(document.body, 'click', '.myClass, li', function (e) {
console.log('Clicked', e.target.innerText);
});
githubから の場合に取得できます。
event.target.classList.contains('someClass')
で動的に作成されたHTML
elements
への匿名タスクの委任
true
またはfalse
を返します例えば。 let myEvnt = document.createElement('span');
myEvnt.setAttribute('class', 'someClass');
myEvnt.addEventListener('click', e => {
if(event.target.classList.contains('someClass')){
console.log(${event.currentTarget.classList
})}})
参照: https://gomakethings.com/attaching-multiple-elements-to-a-single-event-listener-in-Vanilla-js/
ここで注目に値する不明瞭な問題は、私が今発見したこの事実かもしれません:
要素に
z-index
が-1
以下に設定されている場合、実際にはそうであるにもかかわらず、リスナーはバインドされていないと思われるかもしれませんが、ブラウザはより高いz-index
素子。
この場合の問題は、リスナーがバインドされていないことではなく、他の何か(たとえば、隠された要素)が要素の上にあるため、フォーカスを取得できないことです。代わりにフォーカスを取得します(つまり、イベントはトリガーされていません)。幸いなことに、要素を右クリックして「検査」を選択し、クリックしたものが「検査中」かどうかを確認することで、これを簡単に検出できます。
私はChromeを使用していますが、他のブラウザーがそれほど影響を受けているかどうかわかりません。しかし、機能的には、ほとんどの点で、リスナーが拘束されていないという問題に似ているため、見つけるのは困難でした。 CSSから次の行を削除して修正しました:z-index:-1
;