イベントのキャプチャ、Bubbling、および委任
18369 ワード
≪イベント|Events|ldap≫
イベントハンドラ
イベントバッファ
const outer = document.querySelector('.outer');
const middle = document.querySelector('.middle');
const button = document.querySelector('button');
outer.addEventListener('click', (e) => {
console.log(`${e.currentTarget}, ${e.target}`);
});
middle.addEventListener('click', (e) => {
console.log(`${e.currentTarget}, ${e.target}`);
});
button.addEventListener('click', (e) => {
console.log(`${e.currentTarget}, ${e.target}`);
});
イベントバッファの停止
event.stopPropagation()
上のbundlingは防止できますが、同じ要素に複数のハンドルがある場合は、他のハンドルの動作を阻止できません.event.stopImmediatePropagation()
同じ要素の特定のイベントでメソッドを実行するプロセッサのみが機能し、他のすべてのプロセッサは機能しません. const outer = document.querySelector('.outer');
const middle = document.querySelector('.middle');
const button = document.querySelector('button');
outer.addEventListener('click', (e) => {
// 메소들을 사용한 버블링 막기보다 안정적인 방법
// 이벤트가 발생한 타겟과 현재 핸들러가 동작하는 타겟이 같은 경우가 아니면 아무동작없이 return
if (e.currentTarget !== e.target) {
return;
}
console.log(`${e.currentTarget}, ${e.target}`);
});
middle.addEventListener('click', (e) => {
// 메소들을 사용한 버블링 막기보다 안정적인 방법
// 이벤트가 발생한 타겟과 현재 핸들러가 동작하는 타겟이 같은 경우가 아니면 아무동작없이 return
if (e.currentTarget !== e.target) {
return;
}
console.log(`${e.currentTarget}, ${e.target}`);
});
button.addEventListener('click', (e) => {
console.log(`${e.currentTarget}, ${e.target}`);
});
イベントのキャプチャ
図
委任イベント
// Bad Code
// 모든 자식요소에 이벤트리스너를 등록하여 메모리 낭비
const lis = document.querySelectorAll('li');
lis.forEach((el) => {
el.addEventListener('click', () => {
el.classList.add('selected');
});
});
// Good Code
// 이벤트 위임을 통한 강력한 핸들링
const ul = document.querySelector('ul');
ul.addEventListener('click', (e) => {
// e.target을 통해 이벤트가 발생한 요소를 알 수 있다.
if (e.target.tagName === 'LI') {
e.target.classList.add('selected');
}
});
参考資料
Reference
この問題について(イベントのキャプチャ、Bubbling、および委任), 我々は、より多くの情報をここで見つけました https://velog.io/@codenmh0822/이벤트-캡처링과-버블링-그리고-위임テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol