๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/Javascript

(50) [JavaScript] 6์ผ JavaScript ๊ฐ์ฒด - ์ด๋ฒคํŠธ

by ๋”ฐ๊ถˆ 2024. 4. 28.

 

 

์ด๋ฒคํŠธ๋ž€?
HTML ์ด๋ฒคํŠธ๋Š” HTML ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์œผ๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ HTML ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ๋ ๋•Œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋Ÿฐ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•œ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์—๋Š” ํ†ต์ง€ํ•ด ์ค€๋‹ค.
์ด ๊ณผ์ •์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์›นํŽ˜์ด์ง€๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก 

HTML ์š”์†Œ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. onclick ๊ณผ ๊ฐ™์ด on์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฒคํŠธ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ์„ ์ „๋‹ฌํ•œ๋‹ค. HTML๊ณผ Javascript๋Š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ์ด ๋ฐฉ์‹์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. 

</head>
<body>

	<h3>์ด๋ฒคํŠธ ๋“ฑ๋ก - ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฐฉ์‹</h3>
	
	<p><button type="button" onclick="sub1();"> ํ™•์ธ 1 </button></p>
	<p><button type="button" onclick="sub1(); sub2();"> ํ™•์ธ 2 </button></p>
	
	<script type="text/javascript">
	function sub1() {
		alert('sub1...');
	}
	
	function sub2() {
		alert('sub2...');
	}
	
	</script>
	
	<script type="text/javascript">
	
	
	</script>

</body>
</html>

 

</head>
<body>

	<h3>์ด๋ฒคํŠธ ๋“ฑ๋ก - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹</h3>
	
	<p> <button type="button" class="btn"> ํ™•์ธ </button></p>
	
	<script type="text/javascript">
	//์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€  button๋ณด๋‹ค ์œ„์— ์žˆ์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 
	
	const btn = document.querySelector('.btn');
	
	btn.onclick = function() {
		alert('ํด๋ฆญ 1...');
	};
	
	// ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ๋“ฑ๋ก ๊ฐ€๋Šฅ
	// ์ฒซ๋ฒˆ์งธ ๋ฐ”์ธ๋”ฉ๋œ ์ด๋ฒคํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 
	btn.onclick = function() {
		alert('ํด๋ฆญ 2...');
	};
	
	</script>
	
</body>
</html>

 

 

addEventListener() 

EventTarget ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋กœ ์—˜๋ ˆ๋ฉ˜ํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์š”์†Œ์— ๊ฐ™์€ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

</head>
<body>

	<h3>์ด๋ฒคํŠธ ๋“ฑ๋ก : addEventListener</h3>

	<p>
		<button type="button" class="btn">ํ™•์ธ</button>
	</p>

	<script type="text/javascript">
		const btn = document.querySelector('btn');
		
		
		//๋‘˜ ๋‹ค ์‹คํ–‰๋œ๋‹ค. 
		
		btn.addEventListener('click',function(){
			alert('ํด๋ฆญ 1');
		});
		
		btn.addEventListener('click',()=>{
			alert('ํด๋ฆญ 2')
		});
	</script>

</body>
</html>

 

 

</head>
<body>

	<h3>๋™์  ๊ฐ์ฒด ์ด๋ฒคํŠธ ๋“ฑ๋ก</h3>

	<p>
		<button type="button" onclick="append()">์ถ”๊ฐ€</button>
	</p>
	<hr>
	<div class="resultLayout">
		<p>
			<button type="button" class="btnOk" data-num="1">๋ฒ„ํŠผ</button>
		</p>
	</div>

	<script type="text/javascript">
		var idx = 1;

		function append() {
			const divEL = document.querySelector('.resultLayout');
			let out = divEL.innerHTML;

			idx++;
			out += `<p><button type="button" class="btnOk" data-num="${idx}">๋ฒ„ํŠผ</button></p>`;

			divEL.innerHTML = out;
			//innerHTML๋Š” ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Œ 
		}
		
		//๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” load ์ด๋ฒคํŠธ ๋‹จ๊ณ„์—์„œ ๊ฒ€์ƒ‰ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ ๋˜์ง€ ์•Š๋Š”๋‹ค. 
		/*
		window.addEventListener('load',()=>{
			const btnEls = document.querySelectorAll('.btnOk');
			
			for(let el of btnEls){
				el.addEventListener('click',e=>{
					let num = e.target.getAttribute('data-num');
					alert(num);
				});
			}
		});
		*/
		
		//๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ฒ„ํŠผ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์œ„ ๊ฐ์ฒด์— ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ 
		//	ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. 
		const resultEL = document.querySelector('.resultLayout');
		resultEL.addEventListener('click',e=>{
			// e.target : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฐ์ฒด 
			//matches('์„ ํƒ์ž') :์š”์†Œ์˜ ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋ฉด true 
			if(e.target.matches('.btnOk')){
				let num = e.target.getAttribute('data-num');
				alert(num);
			}
		});
		
		
		
	</script>

</body>
</html>

 

 

 

 

removeEventListener()

EventTarget ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋กœ ์—˜๋ ˆ๋ฉ˜ํŠธ์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. 

</head>
<body>

	<h3>์ด๋ฒคํŠธ ์ œ๊ฑฐ</h3>

	<p>์ธ๋ผ์ธ ์ด๋ฒคํŠธ</p>
	<p>
		<button type="button" onclick="sub(this);">ํ™•์ธ</button>
	</p>
	<script type="text/javascript">
		function sub(obj) {
			alert('ํ•œ๋ฒˆ...');

			obj.removeAttribute('onclick');
		}
	</script>
	<hr>

	<p>์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹</p>
	<p>
		<button type="button" class="btn2">ํ™•์ธ</button>
	</p>
	<script type="text/javascript">
	const btn2 = document.querySelector('.btn2');
	
	btn2.onclick=()=>{
		alert('๋‹ค์‹œ ๋ˆ„๋ฅด์ง€ ๋งˆ์„ธ์š”~');
		
		btn2.onclick=null;
	}
	
	</script>
	<hr>

	<p>addEventListener()/removerEventListener()</p>
	<p>
		<button type="button" class="btn3">ํ™•์ธ</button>
		<button type="button" class="btn4">์ œ๊ฑฐ</button>
	</p>
	<script type="text/javascript">
	const btn3 = document.querySelector('.btn3');
	const btn4 = document.querySelector('.btn4');
	
	const fn=()=>alert('์•ˆ๋…•...');
	
	btn3.addEventListener('click',fn); // click์ด๋ฒคํŠธ ๋“ฑ๋ก
	

	btn4.addEventListener('click',e=>{ // click ์ด๋ฒคํŠธ ํ•ด์ œ 
		btn3.removeEventListener('click',fn,false);
	});
	</script>

</body>
</html>

 

 

 

</head>
<body>

	<h3>์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ ๊ฐ์ฒด</h3>


	<p>
		<button type="button" onclick="sub();">ํ™•์ธ</button>
	</p>
	<hr>
	
	<script type="text/javascript">
	function sub() {
		//event : ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ ๊ฐ์ฒด 
		//event๋Š” deprecated ๋˜์—ˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ฒƒ์„ ๊ถŒ์žฅ 
		console.log(event.currentTarget);
		console.log(event.target);
	}
	</script>

	<p>
		<button type="button" class="btn1" id="b1">์ž๋ฐ”</button>
		<button type="button" class="btn1" id="b2">์Šคํ”„๋ง</button>
		<button type="button" class="btn1" id="b3">์˜ค๋ผํด</button>

	</p>
	<div id="resultLayout"></div>
	<hr>

	<script type="text/javascript">
	const btnEls= document.querySelectorAll('.btn1');
	
	const fun = e =>{
		//์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๊ฐ์ฒด(์ด๋ฒคํŠธ ๋“ฑ๋ก ๊ฐ์ฒด)
		let obj = e.currentTarget;
		
		//์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ๊ฐ์ฒด์˜ ํƒœ๊ทธ ์ด๋ฆ„ 
		let tag = obj.tagName;
		
		//์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ๊ฐ์ฒด์˜ id
		let i = obj.id;
		
		//์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ๊ฐ์ฒด์˜ innerText(ํ…์ŠคํŠธ)
		let t = obj.innerText;
		let s = '์ด๋ฒคํŠธ ๋ฐœ์ƒ๊ฐ์ฒด์˜ ํƒœ๊ทธ:'+tag+'<br>';
		s+='์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ฐ์ฒด์˜ id : '+i+'<br>';
		s+='์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ฐ์ฒด์˜ innerText : '+t;
		
		document.querySelector('#resultLayout').innerText=s;
		
	};
	
	//๋ชจ๋“  ๋ฒ„ํŠผ์— click ์ด๋ฒคํŠธ ๋“ฑ๋ก 
	btnEls.forEach(el=>el.addEventListener('click',e=>fun(e)));
	
	
	/* for(let el of btnEls){
		el.addEventListener('click',e=>fun(e));
	} */
	
	</script>

	<p>
		<button type="button" class="btn">
			<span>ํ™•์ธ</span>
		</button>
	</p>
	<hr>
	<script type="text/javascript">
		const btn = document.querySelector('.btn');

		//์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ : ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด 
		btn.addEventListener('click', function(e) {
			//console.log(e);
			
			console.log(e.target);	// ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ๊ฐ์ฒด, <span>
			console.log(e.currentTarget); // ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋œ ๊ฐ์ฒด, <button>
		}); 

	</script>

</body>
</html>

 

 

์ด

 


<style type="text/css">
.box1 {
	background: #ccc;
	padding: 20px;
	display: block;
}

.box2 {
	background: #ccc;
	padding: 20px;
	display: block;
}

.box3 {
	background: #ccc;
	padding: 20px;
	display: block;
}
</style>

</head>
<body>

	<h3>์ด๋ฒคํŠธ ์ทจ์†Œ - preventDefault</h3>

	<!-- 
	
		- a href ์†์„ฑ : a ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™
		- a ํƒœ๊ทธ์— click ์ด๋ฒคํŠธ๋„ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ : ๋จผ์ € click ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  href ์†์„ฑ์œผ๋กœ ์ด๋™
		- preventDefault() : ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ• ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•˜์ง€๋งŒ ์ƒ์œ„๋กœ์˜ ์ด๋ฒคํŠธ๋Š” ์ „ํŒŒ๋œ๋‹ค. 
	
	 -->



	<div class="box1">
		DIV ์˜์—ญ
		<p class="box2">
			p ์˜์—ญ <a class="box3" href="https://m.naver.com/" target="_blank">A
				์˜์—ญ</a>
		</p>
	</div>
	<hr>
	<div class="console"></div>

	<script type="text/javascript">
		const box1 = document.querySelector('.box1');
		const box2 = document.querySelector('.box2');
		const box3 = document.querySelector('.box3');

		const console = document.querySelector('.console');

		box1.addEventListener('click', function(e) {
			console.innerHTML += 'DIVํด๋ฆญ<br>';
		});

		box2.addEventListener('click', function(e) {
			console.innerHTML += 'P ํด๋ฆญ<br>';
		});

		box3.addEventListener('click', function(e) {
			console.innerHTML += 'A ํด๋ฆญ<br>';

			//์ด๋ฒคํŠธ ๊ธฐ๋ณธ ๋™์ž‘์ด ์ค‘์ง€๋œ๋‹ค. 
			//href ์†์„ฑ์ด ๋ฌดํšจํ™” ๋œ๋‹ค. 
			//์ƒ์œ„๋กœ์˜ ์ด๋ฒคํŠธ๋Š” ์ „ํŒŒ๋œ๋‹ค. 
			e.preventDefault();
			
			
			//e.stopPropagation();
				//stopPropagation()๋Š” href๋Š” ๋ฌดํšจํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค.
				//์ƒ์œ„๋กœ์˜ ์ด๋ฒคํŠธ๋Š” ์ „ํŒŒ๋˜์ง€ ์•Š๋Š”๋‹ค.
				//href๋Š” ์‚ด์•„์žˆ๊ณ , p, div ํด๋ฆญ์€ ๋ฌดํšจํ™” ๋œ๋‹ค. 
				
			
		});
	</script>


</body>
</html>

 

 

 


</head>
<body>

	<h3>์ด๋ฒคํŠธ ์ทจ์†Œ - stopPropagation</h3>

	<!-- 
	- span ํด๋ฆญ 
	: ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋Š” ํ•˜์œ„์—์„œ ์ƒ์œ„๋กœ ์ „ํŒŒ
	: span์˜ click ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ - p click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ - div click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰
	- stopPropagation()
	: ์ƒ์œ„๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜์ง€ ์•Š๋„๋ก ์ค‘๋‹จ  
 -->


	<div class="box1">
		DIV ์˜์—ญ
		<p class="box2">
			p ์˜์—ญ <span class="box3">SPAN์˜์—ญ</span>
		</p>
	</div>
	<hr>
	<div class="console"></div>

	<script type="text/javascript">
		const box1 = document.querySelector('.box1');
		const box2 = document.querySelector('.box2');
		const box3 = document.querySelector('.box3');

		const console = document.querySelector('.console');

		box1.addEventListener('click', function(e) {
			console.innerHTML += 'DIVํด๋ฆญ<br>';
		});

		box2.addEventListener('click', function(e) {
			console.innerHTML += 'P ํด๋ฆญ<br>';
		});

		box3.addEventListener('click', function(e) {
			console.innerHTML += 'SPAN ํด๋ฆญ<br>';

			e.stopPropagation();
            
		});
	</script>

</body>
</html>