티스토리 뷰
개요
이번주는 자바 코딩하던 중 보게 된 미디엄 글을 보고 정리하며 추가적으로 궁금한 점에 대해 덧붙여 정리하였다.
https://javascript.info/introduction-browser-events#object-handlers-handleevent
https://medium.com/geekculture/event-handlers-vs-event-listeners-in-javascript-b4086b8040b0
https://developer.mozilla.org/en-US/docs/Web/Events
내용
event 란?
웹 브라우저가 알려주는 HTML 요소에 대한 사건의 발생을 의미.
버튼을 클릭하면 모달을 표시하여 이벤트에 응답할 수 있게 하는 것 등이 예시로 들 수 있다.
event가 발생하면 브라우저는 event 객체를 만들고 세부 정보를 입력 후 Handler에 인수로 전달한다.
Event 를 할당하는 방법
1. HTML 속성
<input value="Click me" onclick="alert('Click!')" type="button">
- 이름이 지정된 속성을 사용하여 HTML로 설정할 수 있다.
- 마우스로 클릭하면 onclick이 실행되는데 HTML 속성은 많은 코드를 작성하기 때문에 로직을 작성하는 것은 적합하지 않다.
- JavaScript 함수를 만들고 호출하는 방식을 권장.
<input type="button" onclick="test()" value="Count rabbits!">
<Script>
function test() {
alert("Click");
}
</Script>
2. DOM 속성
- elem.onclick와 같은 DOM 속성을 사용하여 할당한다.
- Handler가 HTML 속성을 사용하여 지정되면 브라우저는 이것을 읽고 속성 내용에서 새 함수를 생성하여 DOM 속성에 사용한다.
- HTML 속성과 동일한 방법이기에 동작 원리도 동일하다.
<input id="elem" type="button" value="Click me">
<script>
elem.onclick = function() {
alert('test');
};
</script>
2. this 사용하여 접근하기.
- this를 사용하여 Handler 내부 요소 값에 접근한다.
<button onclick="alert(this.innerHTML)">Click!</button>
event 할당 시 주의점
- 기존 함수를 이벤트로 할당할 경우 마지막에 ()를 붙여야한다. (함수 호출과 동일하다.)
- setAttribute를 Handler에 사용하면 동작하지 않는다.
- DOM 속성은 대/소문자가 중요하다.
JavaScript의 event 처리 방법
- EventHandler
- EventHandler 개체의 속성 중 하나를 사용한다.
- EventHandler는 EventListener와 콜백 함수로 구성되어 있다.
- EventHandler 한 번 사용할 수 있고, EventHandler를 2번 사용하게 된다면 이전 Handler를 모두 덮어쓴다.
const button = document.querySelector(".btn")
button.onclick = () => {
console.log("Button clicked.");
};
- EventListener
- EventHandler 의 단점을 해결하고자 만든 것이 EventListener 이다.
- Event를 수신하고 발생할 때 트리거가 되는 EventListener 객체를 사용한다.
- EventListener 가 참조할 수 있는 이벤트 종류의 인덱스는 개요의 2번째 링크를 들어가면 자세히 확인할 수 있다.
- 하나만 사용할 수 없다.
- 일부 Event의 경우 Handler는 addEventListener에서만 작동한다. (DOMContentLoaded Event와 동일)
- DOMContentLoaded는 문서가 로드되고 DOM이 빌드될 때 트리거가 되는 Event이다.
- EventListener 사용시 Handler에 대한 함수 대신 handlerEvent 를 사용하여 객체 또는 클래스 전달이 가능하다.
const button = document.querySelector(".btn")
button.addEventListener("click", () =>
console.log("Button clicked.");
)
차이를 비교한 예시 코드
- EventHandler - 하나의 이벤트
const button = document.querySelector(".btn")
button.onclick = () => {
console.log("First event handler!");
};
button.onclick = () => {
console.log("Second event handler!");
};
출력되는 결과값 (drag)
Second event handler!
- EventListener - 다수의 이벤트
const button = document.querySelector(".btn")
button.addEventListener("click", () => {
console.log("First event listener!");
});
button.addEventListener("click", () => {
console.log("Second event listener!");
});
출력되는 결과값 (drag)
First event listener!
Second event listener!
EventListener를 제거하고 싶다면?
- removeEventListener()를 사용하라.
element.removeEventListener(event, handler, [options]);
- 핸들러를 제거하려면 할당된 것과 완전히 동일한 함수를 전달해야 한다.
- 함수를 변수에 저장하지 않으면 제거할 수 없는데, EventListene에서 다시 읽어올 방법이 없기 때문이다.
틀린 예시
elem.addEventListener( "click" , () => alert('Thanks!'));
elem.removeEventListener( "click", () => alert('Thanks!'));
올바른 예시
function a() {
alert( 'Thanks!' );
}
input.addEventListener("click", a);
input.removeEventListener("click", a);
결론
- 이벤트를 처리하는 방법은 총 3가지가 존재한다.
- HTML 속성 - HTML 속성에 이벤트를 처리하면 HTML 태그 중간에 있는 JavaScript 코드가 이질적으로 보일 수 있기에 드물게 사용되고, 많은 코드를 작성할 수 없다.
- DOM 속성 - DOM 속성을 사용하는 것은 괜찮으나 특정 이벤트 핸들러를 둘 이상 할당할 수 없다.
- addEventListener를 사용하는 방법 - 해당 객체는 이벤트 핸들러로 지원이 되고, 이런 경우 handlerEvent 메서드가 호출된다.
- Handler를 할당하는 방법에 상관없이 첫 번째 인수로 event 객체를 가져오고, 해당 개체에서 발생할 일에 대한 세부 정보가 포함된다.
- EventListener와 EventHandler는 둘 다 Event를 처리한다는 것이 동일하지만 이벤트를 처리하는 개수의 차이가 존재한다.
- 궁극적으로는 이벤트 처리를 위해 함수를 DOM 요소와 연결하는 방법이 다른 것일 뿐 궁극적인 메커니즘은 본질적으로 동일하다.
추가로 보면 좋은 자료
https://kyounghwan01.github.io/blog/JS/JSbasic/addEventListener/
'새롭게 시작하는 개발 이야기' 카테고리의 다른 글
한 입 크기로 잘라먹는 리액트 3장 - node.js (1) | 2023.05.24 |
---|---|
디자인 패턴 - 4월 27일 스터디 발표 (0) | 2023.04.27 |
Http response status code의 종류 - 3월 30일 발표 (0) | 2023.03.30 |
서버사이드 렌더링과 클라이언트 사이드 렌더링 - 3월 23일 스터디 발표 (0) | 2023.03.23 |
javascript와 단일 쓰레드의 관계 - 3월 15일 스터디 발표. (2) | 2023.03.15 |
- Total
- Today
- Yesterday
- JAR
- web
- header
- 멀티모듈
- 개발
- mapping
- 모듈
- MySQL
- 인텔리J
- 개발일지
- Spring
- springboot
- 회고
- homebrew
- 프로그래머스
- 스터디 회고
- 자바스크립트
- RequestHandler
- Request Handler
- 일지
- graphQL
- JavaScript
- Spring Boot
- 한 입 크기로 잘라먹는 리액트
- @Autowired
- body
- Java
- Gradle
- spring-boot
- HTTP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |