Front-End/JavaScript

์ž์‹ Element๊ฐ€ ์žˆ์„ ๋•Œ Drag&Drop Event ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ ๋˜๋Š” ์ด์Šˆ

Splin 2024. 12. 8. 18:10

0. ๊ฐœ์š”

ํŒ€ ๋‚ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ค‘ React ์ปดํฌ๋„ŒํŠธ์—์„œ Drag&Drop Event๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ Drag&Drop Event๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋งŒํผ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์˜๋„ํ•œ ๋™์ž‘์€ ์ปดํฌ๋„ŒํŠธ์— mouse over ์œ ๋ฌด์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ด์Šˆ๋Š” ์žก์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ํ•ด๋‹น ์ด์Šˆ์— ๋Œ€ํ•œ ์›์ธ๊ณผ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(์•„๋ž˜ ์˜ˆ์ œ๋“ค์€ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด์–ด console.log๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.)

See the Pen Drag&Drop Event Example by ์œค์ฐฝํ˜„ (@ibgcsnij-the-selector) on CodePen.

 

 

1. ์›์ธ

์œ„ ์˜ˆ์ œ๋ฅผ ํ† ๋Œ€๋กœ ์›์ธ์„ ์•Œ์•„๋ณด์ž๋ฉด, Drag ์ค‘์ธ ์ƒํƒœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•˜๋ฉด dargleave ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ isDragging์ด false๊ฐ€ ๋˜๊ณ  dragenter ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋˜์–ด isDragging์ด true <-> false๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” dragenter์™€ dragleave ๋ฟ์ด์ง€๋งŒ, dragover๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์€ ๋” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ฐœ์š”์—์„œ ๋งํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์˜๋„ํ•œ ๋™์ž‘์€ ์ปดํฌ๋„ŒํŠธ์— mouse over ์œ ๋ฌด์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— drag ์ค‘์ธ ๋งˆ์šฐ์Šค๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์œ„์— ์žˆ์„ ๋•Œ isDragging์ด false๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด dragleave event์˜ currentTarget๊ณผ relatedTarget ์„ ์ด์šฉํ•ด ์ž์‹ ๋งˆ์šฐ์Šค๊ฐ€ ์ž์‹ element์— ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋ฉด dargleave ์ด๋ฒคํŠธ ๋‚ด ๋กœ์ง์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

See the Pen Drag&Drop Event Example by ์œค์ฐฝํ˜„ (@ibgcsnij-the-selector) on CodePen.

currentTarget๊ณผ relatedTarget์€ ๊ฐ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋งˆ๋‹ค ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, dargeleave ์ด๋ฒคํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

draglaeve ์ด๋ฒคํŠธ์—์„œ์˜ currentTarget, relatedTarget
currentTarget
: ๋งˆ์šฐ์Šค๊ฐ€ ๋– ๋‚œ element
relatedTarget: ๋งˆ์šฐ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” element

๋‹ค๋ฅธ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์—์„œ์˜ currentTarget, relatedTarget์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์Œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

3. ๋งˆ์น˜๋ฉฐ

์›์ธ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์€ ๋ฌธ์ œ์ด์ง€๋งŒ, ๋ชจ๋ฅธ๋‹ค๋ฉด ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ๋Š์ž„์—†์ด ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์‚ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์„ ๋ฒ•ํ•œ ์ด๋ฒคํŠธ๋“ค์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ ๊ฒ€ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.