* DOM 요소에 클릭이벤트 핸들러를 할당하는 방법 *
1. onclick : DOM 요소에 포함된 이벤트 속성
2. addEventListener : DOM 요소에 이벤트 핸들러를 동적으로 추가하는 메서드.
[ onclick ]
DOM 요소에 포함된 이벤트 속성. 단일 이벤트 핸들러.
<button onclick="alert('버튼클릭')">버튼</button>
=> 태그 내부에 클릭이벤트 핸들러를 직접 지정할 수 있다. (하지만 함수로 분리해서 지정하는 방법 추천!)
- 단일 이벤트 핸들러
: 하나의 이벤트에 대해 하나의 핸들러만 설정할 수 있다.
const button = document.querySelector('button');
button.onclick = function() {
console.log('Button clicked via onclick!');
};
// 기존 핸들러는 덮어쓰여짐
button.onclick = function() {
console.log('Another handler for onclick!');
};
=> button의 속성값(onclick)으로 함수를 할당하는 것!!
속성값을 변경하면 덮어씌워지는 것처럼 이벤트 핸들러도 마지막에 할당한 함수로 덮어씌워진다.
[ addEventListener ]
DOM 요소에 이벤트 핸들러를 동적으로 추가하는 메서드.
다중 이벤트 핸들러 ( 하나의 요소에 여러 개의 이벤트 할당 가능 )
- 다중 이벤트 핸들러
: 동일한 이벤트에 대해 여러개의 핸들러를 추가할 수 있다. => 이벤트 캡처링/버블링, 제거 기능
const button = document.querySelector('button');
function handleClick() {
console.log('Button clicked!');
}
// 이벤트 핸들러 추가
button.addEventListener('click', handleClick);
// 추가 핸들러도 가능
button.addEventListener('click', () => {
console.log('Another click handler!');
});
=> button의 속성에 함수(click이벤트 핸들러)를 추가하는 것!!
하나의 요소가 여러 속성을 가질 수 있는것처럼 여러가지 이벤트 핸들러 할당 가능.
[ DOM 이벤트 전파 방식 ]
대부분의 DOM 이벤트는 버블링 단계에서 발생.
- 캡처링 단계 (상위 요소 → 하위 요소)
- 타깃 단계 (이벤트가 실제 타깃 요소에서 발생)
- 버블링 단계 (하위 요소 → 상위 요소)
<div id="parent">
<button id="child">Click me</button>
</div>
1. 이벤트 캡처링 (Capturing)
이벤트가 최상위 요소 ~> 하위 요소로 내려가는 방식.
document.getElementById('parent').addEventListener('click', () => {
console.log('Parent clicked');
}, true); // true는 캡처링 단계에서 실행되도록 설정
document.getElementById('child').addEventListener('click', () => {
console.log('Child clicked');
}, true);
// Parent clicked
// Child clicked
=> addEventListener 의 세번째 변수를 true로 설정!
2. 이벤트 버블링 (Capturing)
이벤트가 하위(타깃) 요소 ~> 상위 요소로 전파되는 방식.
document.getElementById('parent').addEventListener('click', () => {
console.log('Parent clicked');
}, false); // false 또는 생략하면 버블링 단계에서 실행
document.getElementById('child').addEventListener('click', () => {
console.log('Child clicked');
}, false);
// Child clicked
// Parent clicked
=> addEventListener 의 세번째 변수 생략 or false로 설정!
* 이벤트 위임 *
document.getElementById('parent').addEventListener('click', (event) => {
if (event.target.tagName === 'BUTTON') {
console.log('Button inside parent clicked');
}
});
부모요소 클릭 ==> 자식요소가 버튼이라면 작동!
버튼(자식요소)이 아닌 부모요소에 이벤트를 설정하여 자식요소에서 발생하는 이벤트를 처리.
** 하나의 기능을 수행하는 버튼을 여러 요소 내부에서 공통으로 사용하는 경우 활용 가능.
(각 요소의 버튼마다 이벤트를 추가할 필요 없음)
'JavaScript > 공부공부' 카테고리의 다른 글
[JS] Form & Checkbox (2) | 2024.11.06 |
---|---|
[JS] Property vs Attribute (0) | 2024.11.06 |
[JS] new 연산자, 프로토타입 객체 (0) | 2024.11.05 |
[jQuery] jQuery 플러그인 $.fn (사용자 정의 함수) (0) | 2024.11.05 |
[JS] FormData 객체 (0) | 2024.11.05 |