이벤트 타입은 약 200여 가지가 있으며,
이벤트 목록에 대한 상세목록은 MDN에서 확인할 수 있다.
이벤트 핸들러를 등록하는 방법은 3가지이며 아래와같다.
HTML 요소의 어트리뷰트 중에는 이벤트에 대응하는 이벤트 핸들러 어트리뷰트가 있다.
이벤트 핸들러 어트리뷰트 값으로 함수 호출문 등의 문을 할당하면 이벤트 핸들러가 등록된다.
<!DOCTYPE html>
<html>
<body>
<button onClick="sayHi('Lee')">Click me!</button>
<script>
function sayHi(name){
console.log(`Hi! ${name}.`);
}
</script>
</body>
</html>
어트리뷰트는 파싱되어 다음과같은 함수를 암묵적으로 생성하고, 이벤트 핸들러 어트리뷰트 이름과 동일한 키 onClick 이벤트 핸들러 프로퍼티에 할당한다.function onClick(event){
sayHi('Lee');
}
이벤트 핸들러 어트리뷰트 방식은 오래된 코드에서 간혹 사용하고있으며,
HTML과 JavsScript는 분리하는 것이 좋기 때문에 더는 사용하지 않는 것이 좋다.
하지만 CBD(Component Based Developement)방식의 Angular/React/Svelte/Vue 같은 프레임워크/라이브러리에서는 이벤트 핸들러 어트리뷰트 방식으로 이벤트를 처리한다.(CBD는 HTML, CSS, Js를 관심사가 다른 개별적인 요소가 아니라고 본다.)
$button.onclick = function(){
console.log('button click');
};
- button : 이벤트 타깃
- onclick : on+이벤트타입
- function : 이벤트 핸들러
이벤트 핸들러 프로퍼티방식은 HTML과 Js가 뒤섞이는 문제를 해결 할 수 있다.
하지만, 하나의 이벤트 핸들러만 바인딩할 수 있다는 단점이 있다.
<script>
const $button = document.querySelector('button');
$button.onclick = function(){
console.log('button click 1');
};
$button.onclick = function(){
console.log('button click 2');
};
</script>
위 예제에서 첫번째로 바인딩된 이벤트 핸들러는 두번째 바인딩된 이벤트 핸들러에 의해 재할당되어 실행되지 않는다.
<script>
const $button = document.querySelector('button');
$button.addEvetListener('click', function() {
console.log('button click');
};
</script>
공통 프로퍼티 | 설명 | 타입 |
---|---|---|
type | 이벤트 타입 | string |
target | 이벤트를 발생시킨 DOM 요소 | DOM 요소 노드 |
currentTarget | 이벤트 핸들러가 바인딩된 DOM 요소 | DOM 요소 노드 |
eventPhase | 이벤트 전파 단계 | number |
bubbles | 이벤트를 버블링으로 전파하는지 여부 | boolean |
cancelable | preventDefault 메서드를 호출하여 이벤트의 기본 동작을 취소할 수 있는지 여부 | boolean |
defaultPrevented | preventDefault 메서드를 호출하여 이벤트를 취소했는지 여부 | boolean |
isTrusted | 사용자의 행위에 의해 발생한 이벤트인지 여부 | boolean |
timeStamp | 이벤트가 발생한 시각부터 경과한 밀리초 | number |
mouseEvent 타입의 이벤트 객체는 다음과 같은 고유의 프로퍼티를 갖는다.
keyboardEvent 타입의 이벤트 객체는 altKey, ctrlKey, shiftKey, metaKey, key, keyCode 같은 고유의 프로퍼티를 갖는다.