Skip to content

Instantly share code, notes, and snippets.

@tong9433
Last active July 13, 2017 00:15
Show Gist options
  • Save tong9433/4b2329d44233e88beabc6cb9ecdf61cd to your computer and use it in GitHub Desktop.
Save tong9433/4b2329d44233e88beabc6cb9ecdf61cd to your computer and use it in GitHub Desktop.
20170712과제

Event Delegation 이란

<ul id="parent-list">
	<li id="post-1">Item 1</li>
	<li id="post-2" >Item 2</li>
	<li id="post-3">Item 3</li>
	<li id="post-4">Item 4</li>
	<li id="post-5">Item 5</li>
	<li id="post-6">Item 6</li>
</ul>

다음과 같이 부모리스트와 자식 리스트들이 있을 경우에 자식리스트들은 종종 추가되고 삭제되는 경우가 있다. 이때 각각의 자식 element 들의 경우에 따라 다른 listener 혹은 동일한 listener 을 적용할 때 사용한다.

document.getElementById("parent-list").addEventListener("click", function(e) {
	if(e.target && e.target.id == "post-3") {
			//event 
	}
});

이벤트 딜리게이션은 이벤트가 발생되어야 하는 객체에 직접적으로 이벤트를 바인딩 시키는 것이 아닌 객체 상위 요소에 이벤트를 할당하고 인자를 객체를 넘겨줌으로서 실제 이벤트 타겟에 간접적으로 이벤트 바인드 효과를 주는 것을 말한다. 이는 javascript의 이벤트 할당이 메모리에 직접적으로 올라가게 됨으로 반복적이고 과다한 이벤트 할당은 프로그램 성능적으로나 반복적인 코딩등에 문제로 많이 사용되는 이벤트 바인딩 패턴.

header,nav,section,div,footer,ul,dd {margin:0;padding:0;}
li{list-style: none;}
dt {
font-weight: bold;
font-size: 1.2em;
margin-bottom: 5px;
}
dl {
float: left;
width : 75%;
}
dd {
font-size: 0.9em;
}
.mainHeader{
height:200px;
text-align: center;
padding-top: 20px;
line-height: 1.4em
}
.userId {
font-size: 1.2em;
font-weight: bold;
}
.userMessage, .userSNSInfo {
font-size: 0.8em;
color : gray;
}
.userSNSInfo {
overflow: auto;
width: 255px;
margin: 0px auto;
}
.userSNSInfo > li {
float: left;
margin-right: 5px;
width : 80px;
}
.userSNSInfo span.count {
color : #1FB820;
}
.mainView > nav {
height:40px;
margin-top: 10px;
overflow: auto;
border-bottom: 1px solid rgb(228, 228, 228);
border-top: 1px solid rgb(228, 228, 228);
}
.tab {
border-right: 1px solid rgb(228, 228, 228);
float:left;
height:100%;
line-height: 40px;
text-align: center;
width:24.5%;
cursor: pointer;
}
.tab:last-child {
border-right: 0px;
}
.mainView > section {
display:none;
padding:8%;
line-height: 1.5em;
}
.mainView > section.eleDisplayShow {
display:block;
padding:8%;
line-height: 1.5em;
}
.myName {
font-size: 1.2em;
font-weight: bold;
}
.myDesc {
font-size: 0.8em;
}
.eleDisplayShow li {
margin-bottom: 8%;
}
.selectedTab {
background-color: #DF9274;
color: #fff;
}
.section>div:nth-child(1){
font-size: 20px;
margin-bottom: 20px;
}
.section>div:nth-child(2){
font-size: 15px
}
#sec{
margin :30px;
background-color: skyblue;
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>tabUI</title>
<link rel="stylesheet" href="tabUI.css">
</head>
<body>
<div id="wrapper">
<div class="mainView" >
<header class="mainHeader" ><img src="https://avatars1.githubusercontent.com/u/1456761?v=3&s=140" width="80" >
<div class="userId" ><span > </span><span >nigayo</span><span > </span>
</div>
<div class="userMessage" ><span > </span><span >안녕하세요 nigayo입니다.</span><span > </span>
</div>
<ul class="userSNSInfo" >
<li ><span >review : </span><span class="count" >10</span><span > | </span>
</li>
<li ><span >follower : </span><span class="count" ><span >12</span><span > </span></span><span > | </span>
</li>
<li ><span >following : </span><span class="count" ><span >30</span><span > </span></span><span > </span>
</li>
</ul>
</header>
<nav id="navi">
<div class="tab selectedTab" name="1" id="position" >aboutMe</div>
<div class="tab" name="2" id="friend" >friend</span>
</div>
<div class="tab" name="3" id="theme" >theme</span>
</div>
<div class="tab" name="4" id="news" >repository</div>
</nav>
<div id="sec">
</div>
</div>
</div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.1/underscore-min.js"></script>
<script type="text/javascript" src="tabUI.js"></script>
</body>
</html>
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
const navi = document.getElementById('navi');
//Event Delegation Code
navi.addEventListener("click",function(e){
const selectTab = document.getElementsByClassName('selectedTab')[0];
selectTab.classList.remove('selectedTab');
e;
e.target.classList.add('selectedTab');
checkTabAjax();
},false);
});
//tab의 section부분 비동기처리를 해주는 함수
function tabAjax() {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", function(e) {
var htData = JSON.parse(oReq.responseText);
setData(htData)
saveData(htData);
});
const num =document.getElementsByClassName('selectedTab')[0].getAttribute('name');
oReq.open("GET", "http://jsonplaceholder.typicode.com/posts/"+num);
oReq.send();
}
//section에 data를 삽입하는 함수
function setData(data){
var body = _.template("<h1> <%=title%> </h1> </br> <span> <%=body%> </span>");
var sec= document.getElementById('sec');
sec.innerHTML=body(data);
}
const tabData={};
//이미 TabAjax 데이터를 가져온 경우에는 tabAjax() 재요청을 방지.
function checkTabAjax(){
const id=document.getElementsByClassName('selectedTab')[0].getAttribute('id');
console.log(id);
if(tabData.hasOwnProperty(id)){
setData(tabData[id]);
}else{
tabAjax();
}
}
//비동기적으로 가져온 데이터를 id값에 따라 tabData에 저장.
function saveData(data){
const id=document.getElementsByClassName('selectedTab')[0].getAttribute('id');
console.log(data);
tabData[id] = {};
tabData[id].title = data.title;
tabData[id].body = data.body;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment