아 진짜 이벤트 등록 어쩌라는거야!!!
복잡해서 정리한다.
현재 회사에서 쓰는 자바스크립트 이벤트 등록은 아래와 같다.
근데 initEvent가 deprecated 되었다. (더 이상 사용되지 않는)
그리고 커스텀 이벤트 등록은 어떻게 하는걸까?
https://ko.javascript.info/introduction-browser-events
이 사이트 강추! 이벤트를 이해하는데 수월했다.
1) HTML 속성
HTML 안의 on<event> 속성에 핸들러를 할당할 수 있습니다.
아래 같이 input 태그의 onclick 속성에 click 핸들러를 할당하는 것 같이 말이죠.
<input value="클릭해 주세요." onclick="alert('감사합니다')" type="button"> |
2) DOM 프로퍼티
DOM 프로퍼티 on<event>을 사용해도 핸들러를 할당할 수 있습니다.
elem.onclick을 사용한 예시:
<input id="elem" type="button" value="클릭해 주세요."> <script> elem.onclick= function() { alert('감사합니다.'); }; </script> |
3) 1),2)의 문제의 극복 --> addEventListener
HTML 속성과 DOM 프로퍼티를 이용한 이벤트 핸들러 할당 방식엔 근본적인 문제
1), 2) 번의 단점은 이벤트를 하나만 등록 가능하다. 마지막꺼가 덮어버린다
: onclick 프로퍼티는 단 하나밖에 없기 때문에, 복수의 이벤트 핸들러를 할당할 수 없습니다.
// HTML 속성 <input type="button" id="elem" onclick="alert('이전')" value="클릭해 주세요."> <script> elem.onclick= function() { // 기존에 작성된 핸들러를 덮어씀 alert('이후'); // 이 경고창만 보입니다. }; </script> //DOM 프로퍼티 input.onclick= function() { alert(1); } input.onclick= function() { alert(2); } // 이전 핸들러를 덮어씀 |
addEventListener를 여러 번 호출하면 아래와 같이 핸들러를 여러 개 붙일 수 있습니다.
<input id="elem" type="button" value="클릭해 주세요."/> <script> function handler1() { alert('추가 이벤트1!'); }; function handler2() { alert('추가 이벤트2'); } elem.onclick= () => alert("안녕하세요."); elem.addEventListener("click", handler1); // 추가 이벤트 1 elem.addEventListener("click", handler2); // 추가 이벤트 2 </script> |
4) 자주 하는 실수
이미 존재하는 함수를 직접 핸들러에 할당하는 예시
sayThanks() 같이 괄호를 덧붙이는 것은 함수를 호출하겠다는 것을 의미
function sayThanks() { alert('감사합니다!'); } button.onclick= sayThanks; // 올바른 방법 button.onclick= sayThanks(); // 틀린 방법 |
sayThanks()를 프로퍼티에 할당하면 함수 호출의 결괏(result)값이 할당
함수 sayThanks가 아무것도 반환하지 않는다면 onclick 프로퍼티엔 undefined이 할당
이벤트가 원하는 대로 동작하지 않습니다.
하지만 HTML 속성값에는 괄호가 있어야 합니다.
<input type="button" id="button" onclick="sayThanks()"> |
5) addEventListener -> 이벤트 객체 전달
elem.onclick = function(e){ console.dir(e); console.log(e); } |
1) onclick 에 함수의 매개변수로 전달하는건 이벤트 객체가 되나봄
2) 이름 다르게 써도됨
<input type="button" value="클릭해 주세요." id="elem"> <script> elem.onclick = function(event) { // 이벤트 타입과 요소, 클릭 이벤트가 발생한 좌표를 보여줌 alert(event.type + " 이벤트가 " + event.currentTarget + "에서 발생했습니다."); alert("이벤트가 발생한 곳의 좌표는 " + event.clientX + ":" + event.clientY +"입니다."); }; </script> |
6) addEventListener -> 객체 전달
<button id="elem">클릭해 주세요.</button> <script> let obj = { handleEvent(event) { alert(event.type + " 이벤트가 " + event.currentTarget + "에서 발생했습니다."); } }; elem.addEventListener('click', obj); </script> |
let event = document.createEvent("Event"); event.initEvent(service, true, true); document.dispatchEvent(event); document.addEventListener("service", function(event) { // (1) alert("Hello from " + event.target.tagName); // Hello from H1 }); let event = new Event("service"); let event = new Event(service); // 이걸로 document.createEvent("Event"); 대체 가능 event.initEvent(service, true, true); // 이거 안해도 됨 document.dispatchEvent(event); document.addEventListener("service", function(event) { // (1) alert("Hello from " + event.target.tagName); // Hello from H1 }); |
https://ko.javascript.info/dispatch-events
'검색용 개발 블로그' 카테고리의 다른 글
Javascript 에서 외부 URL 호출 하기 (0) | 2021.12.07 |
---|---|
[iframe] iframe안에 있는 javascirpt가 실행될까? (0) | 2021.11.23 |
[jsp] jsp태그 (0) | 2021.10.25 |
[javascirpt] 글씨 넣기 (0) | 2021.10.25 |
[javascirpt] onclick 과 click 함수 (0) | 2021.10.20 |