대부분의 이벤트는 브라우저에 의해 기본 동작을 수행합니다.
그러나, 기본 동작을 막고 직접 동작을 구현하는 경우가 생깁니다.
event
객체를 사용해, 구현된 preventDefault()
메서드를 사용합니다.
링크 클릭시 URL로 이동, 폼 submit시 서버에 폼 전송 등 기본 동작을 막습니다.
addEventListener
의 options중 passive:true
는
브라우저에게 preventDefault()
를 호출하지 않겠다고 알립니다.
모바일의 touchmove
같은 이벤트는 스크롤링을 발생시키는데,
preventDefault
가 호출되지 않았음을 확인하고, 스크롤링을 진행합니다.
이 때, 지연이 생기고 화면이 떨리는 현상이 발생합니다.
passive
옵션은 이러한 지연을 막습니다.
기본 동작을 막은 경우는 event.defaultPrevented
의 값이 true
이고, 아닌 경우는 false
입니다.
stopPropagation
을 사용하는 대신, defaultPrevented
를 통해 이벤트가 적절히 처리됨을 알릴 수 있습니다.
document.addEventListner('contextmenu', event=> {
event.preventDefault();
alert('문서 컨텍스트 메뉴');
});
elem.addEventListner('contextmenu', event=> {
event.preventDefault();
alert('elem 컨텍스트 메뉴');
});
이 때, 이벤트 버블링에 의해 elem
우클릭 시 문서 컨텍스트 메뉴
도 동작합니다.
elem
우클릭시에 문서 컨텍스트 메뉴
는 동작하지 않게 할 때,
stopPropagation
대신 event.defaultPrevented
를 통해 확인합니다.
이미 기본 동작을 막고 동작했다면, 다시 동작하지 않습니다.
document.addEventListner('contextmenu', event=> {
if (event.defaultPrevented) return; // (*)
event.preventDefault();
alert('문서 컨텍스트 메뉴');
});
elem.addEventListner('contextmenu', event=> {
event.preventDefault();
alert('elem 컨텍스트 메뉴');
});
기본 동작을 막으면서, 원하는대로 동작을 수정할 수 있습니다.
하지만, HTML 요소의 의미는 지키면서 동작을 수정해야합니다.
이는, 좋은 코드가 될 뿐 아니라 접근성 측면에서 도움됩니다.