JavaScript를 이용해 HTML 요소에 click 이벤트를 등록하는 경우를 생각해보자.
HTML 요소를 찾은 뒤 addEventListener
를 이용하는 방법이 있고 HTML 요소에 직접 onclick
을 이용하는 방법이 있다.
두 방법 다 특정 이벤트가 발생하면 정해진 함수를 실행하도록 할 수 있다.
겉보기에 같은 기능을 하는 두 방법이 왜 별도로 존재하는 것일까?
1. 표현 방식 비교
<!DOCTYPE html>
<html lang="en">
<head>
<title>Event</title>
</head>
<body>
<button type="button" id="testButton" onclick="handleClick()">click</button>
<script>
function handleClick() {
alert('clicked');
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Event</title>
</head>
<body>
<button type="button" id="testButton">click</button>
<script>
function handleClick() {
alert('clicked');
}
const buttonElement = document.getElementById('testButton');
buttonElement.addEventListener('click', handleClick);
</script>
</body>
</html>
(위의 두 코드의 실행 결과는 같다)
2. 차이점
위애서 handleClick
함수는 콜백함수이다.
이벤트가 발생되었을 때 실행되는 함수라고 생각하면 된다.
2-1. 여러개의 콜백
onclick
에서는 여러개의 콜백함수를 지정할 수 없다.
가장 마지막에 등록된 콜백함수만 실행될 것이다.
반대로, addEventListener
를 사용하면 여러개의 콜백함수를 지정할 수 있다.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Event</title>
</head>
<body>
<button type="button" id="testButton">click</button>
<script>
let buttonElement = document.getElementById('testButton');
buttonElement.onclick = function () {
console.log('callback 1');
};
buttonElement.onclick = function () {
console.log('callback 2');
};
buttonElement.onclick = function () {
console.log('callback 3');
};
</script>
</body>
</html>
onclick
을 사용한 경우 마지막 콜백함수만 실행될 것이며 콘솔에는 callback 3
만 출력될 것이다.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Event</title>
</head>
<body>
<button type="button" id="testButton">click</button>
<script>
let buttonElement = document.getElementById('testButton');
buttonElement.addEventListener('click', function () {
console.log('callback 1');
});
buttonElement.addEventListener('click', function () {
console.log('callback 2');
});
buttonElement.addEventListener('click', function () {
console.log('callback 3');
});
</script>
</body>
</html>
addEventListener
를 사용한다면 콜백함수가 중복으로 등록되고 모든 콜백함수가 실행된다.
2-2. 호환성
onclick
은 모든 브라우저에서 호환된다.
이에 반해 addEventListener
는 인터넷 익스플로러(IE) 8버전 이하에서는 작동하지 않는다.
만약, IE 8버전 이하에 호환되어야 한다면 onclick
을 사용해야 한다.
onclick
을 이용해 콜백함수를 등록할 때 중복되도록 작성하고 싶다면 위에서 처럼 onclick
을 사용하는 대신 attachEvent
를 사용하면 된다.
2-3. 캡처링과 버블링
addEventListener
를 사용한다면 이벤트 캡처링과 버블링을 제어할 수 있다.
위의 예시에서는 콜백함수만 등록했지만 세번째 인자로 boolean
값을 넣을 수 있다.
기본 값은 false
이며 true
를 입력한다면 버블링 대신 캡처링을 사용한다.
element.addEventListner('이벤트', 콜백함수, 버블링/캡처링);
2023.09.03 - [개발/JavaScript] - [JavaScript] 이벤트 버블링과 캡처링
3. 결론
onclick
은 DOM level-0에서 제공하던 기능이고 addEventListener
는 DOM level-2에서 추가된 기능이다.
나중에 추가된 기능인 만큼 버블링/캡처링과 같은 옵션을 지정할 수 있는 것이 장점이다.
여러개의 이벤트를 등록할 수 있으며 최근의 브라우저에서는 대부분 addEventListener
를 지원하기 때문에 이를 사용하지 않을 이유는 없다.
사용자가 IE 8버전 이하를 사용할 가능성이 있다면 (구형 브라우저의 호환성 문제가 있다면) onclick
을 사용하는 것도 잘못된 방법은 아니다. 또한, onclick
은 HTML 태그안에 바로 작성할 수 있으므로 작성한 함수가 정상적으로 동작하는지 확인하기 위해 빠르게 작성할 때 사용할 수도 있을 것이다.
따라서, 대부분의 경우에는 addEventListener
를 사용하는 것을 추천하며 특별한 경우에는 onclick
을 사용할 수 있음을 알고 있어야 한다고 생각한다.
'개발 > JavaScript' 카테고리의 다른 글
[JavaScript] querySelectorAll VS getElementsByClassName (0) | 2023.09.10 |
---|---|
[JavaScript] 이벤트 버블링과 캡처링 (0) | 2023.09.03 |
[NodeJS] 싱글 스레드와 이벤트 루프 (0) | 2023.07.29 |
[JavaScript] 싱글 스레드와 비동기 (0) | 2023.07.23 |
[JavaScript] 함수 (0) | 2023.02.02 |