Language/JavaScript (WEB)

๐ŸŒ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ & ์ด๋ฒคํŠธ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ ๋ฐฉ๋ฒ•

์ธํŒŒ_ 2022. 3. 16. 13:36

removeEventListener-once

์ด๋ฒคํŠธ ์ œ๊ฑฐํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ addEventListener()๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ, ๋ฐ˜๋Œ€๋กœ ์ด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋•Œ removeEventListener() ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

removeEventListener()ํ•จ์ˆ˜๋Š” EventTarget์— ๋“ฑ๋ก๋˜์—ˆ๋˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š”๋ฐ, ์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์ด๋ฒคํŠธ ์ข…๋ฅ˜์™€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜ ์ž์ฒด์˜ ์กฐํ•ฉ์œผ๋กœ ์‹๋ณ„๋˜์–ด ์ œ๊ฑฐ๋˜๋ฉฐ, ์ œ๊ณต๋˜์—ˆ๋˜ ๋‹ค์–‘ํ•œ ์˜ต์…˜์˜ ์ผ์น˜ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋งŒ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

element.removeEventListener('์ด๋ฒคํŠธํƒ€์ž…', ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜)

๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ ์œ ์˜ํ• ์ ์ด ์žˆ๋Š”๋ฐ, ๋ณดํ†ต ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ• ๋•Œ addEventListener์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ต๋ช…ํ•จ์ˆ˜๋กœ ํ•ด์„œ ์ฝ”๋”ฉ์„ ํ•  ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ต๋ช…ํ•จ์ˆ˜๋กœ ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋…์—๋„ ์ข‹๊ณ  ์ฝ”๋“œ๋„ ๋ณด๊ธฐ ์ข‹์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

element.removeEventListener('์ด๋ฒคํŠธํƒ€์ž…', function() {
	//... ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ ์ฝ”๋“œ
})

 

๊ทธ๋Ÿฌ๋‚˜ removeEventListener() ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐ ํ• ๋•Œ ๋ช‡๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ œ๊ฑฐํ•  ์—˜๋ฆฌ๋จผํŠธ(element) ์š”์†Œ์™€ click์ด๋‚˜ keypress ๋“ฑ์˜ ์ด๋ฒคํŠธ ํƒ€์ž… ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฑฐํ•  ์ด๋ฒคํŠธ callback ํ•จ์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

๋งŒ์ผ ์ต๋ช… ํ•จ์ˆ˜๋กœ addEventListener๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค๋ฉด, ์ด ์ต๋ช…ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ์ด๋ฒคํŠธ ์ œ๊ฑฐ๋ฅผ ๋ชปํ•˜๊ฒŒ ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋”ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๋Š” ์‹์œผ๋กœ ํ•ด์•ผ, ๋‚˜์ค‘์— ์ด๋ฒคํŠธ ์ œ๊ฑฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

// ์ด๋ฒคํŠธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ •์˜
function onClickFunction(){
  alert('Hello World !')
}

// ์ด๋ฒคํŠธ ๋“ฑ๋ก
eventTarget.addEventListener('click', onClickFunction)

// ์ด๋ฒคํŠธ ์ œ๊ฑฐ
// eventTarget์— ๊ฑธ๋ ค์žˆ๋Š” click์ด๋ฒคํŠธ์™€ ์ฝœ๋ฐฑํ•จ์ˆ˜ onClickFunction์„ ์ œ๊ฑฐ
eventTarget.removeEventListener('click', onClickFunction)

arguments.callee ์‚ฌ์šฉํ•˜๊ธฐ

๋งŒ์ผ ์ผ์ผํžˆ ์ต๋ช… ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ–์œผ๋กœ ์ผ์ผํžˆ ๋นผ๋‚ด์„œ ์ •์˜ํ•˜๊ธฐ์—” ์–‘์ด ๋งŽ๋‹ค๋ฉด, ์ต๋ช… ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์จ๋„ ์ด๋ฒคํŠธ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ํ•œ๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค. arguments.callee ๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ธ๋ฐ, ์ต๋ช… ํ•จ์ˆ˜์—์„œ๋„ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ธ”๋ก ๋‚ด์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ด๋ฒคํŠธ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ function ํ‚ค์›Œ๋“œ๋กœ ์ž‘์„ฑํ•ด์•ผ ๋œ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” event ๊ฐ์ฒด์™€ ๋”๋ถˆ์–ด arguments์˜ ๋ฐ”์ธ๋”ฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•จ์ˆ˜์—๋Š” ์‚ฌ์šฉ์„ ๊ถŒ๊ณ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

// ์ด๋ฒคํŠธ ๋“ฑ๋ก
eventTarget.addEventListener('click', function(){
    // .. ์ด๋ฒคํŠธ ์ต๋ช… ์ฝœ๋ฐฑํ•จ์ˆ˜ ์‹คํ–‰ 
    
	// ์ด๋ฒคํŠธ ์ œ๊ฑฐ
    eventTarget.removeEventListener('click', arguments.callee)
})

์ œ์ด์ฟผ๋ฆฌ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์œผ๋กœ ๋”ฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

 

[jQuery] ๐Ÿ“š ์ œ์ด์ฟผ๋ฆฌ ์ด๋ฒคํŠธ ๐Ÿ’ฏ ์ •๋ฆฌ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(event handler) // ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ document.querySelector("#btn").addEventListener("click", function(event) { }); // ์ œ์ด์ฟผ๋ฆฌ $("#btn").on("click", function(event) { }); ์ด๋ฒคํŠธ์˜ ์—ฐ๊ฒฐ(eve..

inpa.tistory.com


์ด๋ฒคํŠธ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ

๋งŒ์ผ ๊ทธ๋ƒฅ ํ•œ๋ฒˆ๋งŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋“ฑ๋กํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ์‹๋ณด๋‹ค๋Š” ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ์˜ต์…˜์„ ์ฃผ๋ฉด ๋œ๋‹ค. addEventListener() ๋ฉ”์†Œ๋“œ์˜ 3๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ { once : true } ์ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ์ ์šฉ์ด ๋œ๋‹ค.

eventTarget.addEventListener('click', function() {
  alert('์•ˆ๋…•ํ•˜์„ธ์š”!!');
}, { once : true });