티스토리 뷰
여러개의 이벤트 등록
- 여러개의 이벤트를 등록할 때 반복문을 이용해 이벤트를 여러개 등록 할 수 있다.
반복문 형식 :
*main.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel= "stylesheet" href="css/style.css">
</head>
<body>
<ul>
<li>
<img src="1.jpg" class="product-image" > </li>
<li>
<img src="2.jpg" class="product-image" > </li>
<li>
<img src="3.jpg" class="product-image" > </li>
<li>
<img src="4.jpg" class="product-image" >
</li>
</ul>
<section class="log"></section>
</body>
<script src=js/eventDelegation.js></script>
</html> |
cs |
*style.css
1
2
3
4
5
6
7
8
9
10
11
12 |
li {list-style:none;}
ul > li {
display:inline-block;
padding:10px;
border:1px solid gray;
}
.product-image {
width:100px;
height:auto;
} |
cs |
*eventDelegation.js
1
2
3
4
5
6
7
8 |
var log = document.querySelector(".log");
var lists = document.querySelectorAll("ul > li");
for(var i = 0; i < lists.length; i++){
lists[i].addEventListener("click",function(evt){
log.innerHTML = "URL is " + evt.currentTarget.firstElementChild.src;
});
} |
cs |
- 하지만 반복문을 이용한 처리는 이벤트가 엄청나게 많은 경우 비효율적일 뿐만 아니라, 동적으로 생성된 요소의 이벤트처리를 해야할 경우 다시 이벤트 처리를 구현해야하는 번거로움이 존재한다.
- 이러한 번거로움을 피하기 위해서 우리는 이벤트 위임(Event Delegation)을 이용한다.
이벤트 버블링(Event Bubbling)
- 특정 요소에 이벤트가 발생했을 때, 해당 이벤트가 그 요소의 상위 요소로 전달되는 것을 이벤트 버블링(Event Bubbling)이라고 한다.
- 클릭한 지점이 하위엘리먼트라고 하여도, 그것을 감싸고 있는 상위 엘리먼트까지 올라가면서 이벤트리스너가 있는지 찾게 된다.
- 위 코드에서 eventDelegation.js 를 아래와 같이 수정한다.
* eventDelegation.js
1
2
3
4
5 |
var ul= document.querySelector("ul");
ul.addEventListener("click",function(evt){
console.log(evt.target.tagName); //evt.target은 클릭한것, evt.currentTarget은 이벤트가 등록된 것
}); |
cs |
- 위와 같이 수정하고 ul > li > img 를 클릭하면 이벤트가 발생한다.
- 만약 이 상태에서 img, li, ul에 각각 이벤트를 등록했었다면, 3개의 이벤트 리스너가 실행되게 된다.
Event Bubbling과 Event Capturing의 이벤트 순서
출 처 : https://www.grapecity.com/en/blogs/html-and-wijmo-events/
이벤트 위임(Event Delegation)
- ul이벤트를 등록 하더라도 그 하위 요소에도 이벤트가 발생하는 것을 알게되었다.
- 위의 이벤트 버블링(Event Bubbling)을 이용하면 동적으로 태그가 하나 더 추가되더라도 이벤트를 따로 처리하지 않아도 된다.
1
2
3
4
5
6 |
var ul = document.querySelector("ul");
ul.addEventListener("click",function(evt) {
if(evt.target.tagName === "IMG") {
log.innerHTML = "clicked" + evt.target.src;
}
}); |
cs |
- 예제를 보면, 이미지 태그는 padding 값이 있어서, img태그와 li 태그 사이에 공백이 존재한다. 이 부분(공백)을 클릭하면 이벤트가 발생하지 않는다. tagName이 LI라서 위에서 구현한 조건문으로 들어가지 않았기 때문이다.
1
2
3
4
5
6
7
8
9
10 |
var log = document.querySelector(".log");
var ul= document.querySelector("ul");
ul.addEventListener("click",function(evt){
var target = evt.target;
if(target.tagName === "IMG"){ //태그네임은 대문자로 나온다.
log.innerHTML = "IMG URL 은 " + target.src;
}else if(target.tagName === "LI"){ //테두리(padding 영역) 클릭시 이벤트 발생하게 하기
log.innerHTML = target.firstElementChild.src;
}
}); |
cs |
참고 사이트 : http://www.edwith.org/
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
※
'웹 > 부스트코스' 카테고리의 다른 글
[Spring]Spring IoC/DI 컨테이너 (0) | 2018.07.31 |
---|---|
[WEB]HTML Templating (2) | 2018.07.29 |
[WEB]Ajax 응답 처리와 비동기 (2) | 2018.07.27 |
[WEB]JavaScript 배열 (0) | 2018.07.06 |
[WEB]Maven이란? (0) | 2018.06.29 |
- Total
- Today
- Yesterday
- 버츄어박스
- 자바스크립트 자료구조
- 자바 에센셜 실습문제
- 백준 10451
- 파이썬 진수 변환
- 파이썬 리스트
- css 그리드
- 파이썬 while
- 파이썬 if문
- css
- 자료구조
- 백준 11501
- 파이썬 클래스
- 파이썬 선택문
- 파이썬 for
- css 박스
- 파이썬 함수
- 파이썬 문자열
- 파이썬 예제
- 웹
- 파이썬 객체
- 파이썬 연산자
- 명품 c++ 실습
- 자바스크립트 그래프
- 파이썬
- 자바
- 파이썬 단계적 개선
- 백준 1874
- 백준
- 파이썬 터틀
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |