This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ API

Invalid slug for templ/sidebar: HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ API

HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Firefox์™€ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž๋Š” draggable ์š”์†Œ๋ฅผ ๋งˆ์šฐ์Šค๋กœ ์„ ํƒํ•ด droppable ์š”์†Œ๋กœ ๋“œ๋ž˜๊ทธํ•˜๊ณ , ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์—์„œ ์†์„ ๋—Œ์œผ๋กœ์จ ์š”์†Œ๋ฅผ ๋“œ๋กญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋™์•ˆ draggable ์š”์†Œ๋Š” ๋ฐ˜ํˆฌ๋ช…ํ•œ ์ฑ„๋กœ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹™๋‹ˆ๋‹ค.

์›น ์‚ฌ์ดํŠธ๋‚˜ ํ™•์žฅ ๊ธฐ๋Šฅ, XUL ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด, ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ draggable ์š”์†Œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ draggable ์š”์†Œ์˜ ๋ฐ˜์‘๋“ค์„ ๋งŒ๋“ค์–ด๋‚ด๊ฑฐ๋‚˜ droppable ์š”์†Œ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ ˆ์ฐจ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๋Œ€ํ•œ ์š”์•ฝ ๋“ฑ์ด ์ด ๋ฌธ์„œ์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ

HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์€ DOM event model ๊ณผ drag events ๋ฅผ mouse events ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ๋“œ๋ž˜๊ทธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ draggable ์š”์†Œ๋ฅผ ๋งˆ์šฐ์Šค๋กœ ์„ ํƒํ•˜๊ณ , ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ droppable ์š”์†Œ๋กœ ๊ฐ€์ ธ๊ฐ€ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ๋•Œ๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋„์ค‘์— ๋งŽ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋ช‡๋ช‡ ์ด๋ฒคํŠธ๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ( drag์™€ dragover).

๋ชจ๋“  ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ๋Š” ๊ธ€๋กœ๋ฒŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ์™€ ๋“œ๋ž˜๊ทธ ์ „์—ญ ์†์„ฑ์€ ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ๊ฐ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…๊ณผ ์ฐธ์กฐ ๋ฌธ์„œ๋กœ์˜ ๋งํฌ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์„ค๋ช…
drag ondrag ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ๋“œ๋ž˜๊ทธ ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
dragend ondragend ๋“œ๋ž˜๊ทธ๋ฅผ ๋๋ƒˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. (๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ๋–ผ๊ฑฐ๋‚˜ ESC ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ) (๋“œ๋ž˜๊ทธ ๋๋‚ด๊ธฐ๋ฅผ ๋ณด์‹œ์˜ค)
dragenter ondragenter ๋“œ๋ž˜๊ทธํ•œ ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ์ ํ•ฉํ•œ ๋“œ๋กญ ๋Œ€์ƒ์œ„์— ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. (๋“œ๋กญ ๋Œ€์ƒ ์ง€์ •ํ•˜๊ธฐ๋ฅผ ๋ณด์‹œ์˜ค.)
dragleave ondragleave ๋“œ๋ž˜๊ทธํ•˜๋Š” ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์ด ์ ํ•ฉํ•œ ๋“œ๋กญ ๋Œ€์ƒ์—์„œ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
dragover ondragover ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ์ ํ•ฉํ•œ ๋“œ๋กญ ๋Œ€์ƒ ์œ„๋กœ ์ง€๋‚˜๊ฐˆ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. (๋งค ์ˆ˜๋ฐฑ ๋ฐ€๋ฆฌ์ดˆ๋งˆ๋‹ค ๋ฐœ์ƒํ•œ๋‹ค.)
dragstart ondragstart ์‚ฌ์šฉ์ž๊ฐ€ ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ๋“œ๋ž˜๊ทธํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. (๋“œ๋ž˜๊ทธ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ๋ณด์‹œ์˜ค.)
drop ondrop ์š”์†Œ๋‚˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ์ ํ•ฉํ•œ ๋“œ๋กญ ๋Œ€์ƒ์— ๋“œ๋กญํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. (๋“œ๋กญํ•˜๊ธฐ๋ฅผ ๋ณด์‹œ์˜ค.)

์ฐธ๊ณ : ์ฐธ๊ณ : dragstart์™€ dragend ์ด๋ฒคํŠธ๋Š” ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋“œ๋ž˜๊ทธํ•  ๋•Œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค

HTML ๋“œ๋ž˜๊ทธ์™€ ๋“œ๋กญ ์ธํ„ฐํŽ˜์ด์Šค๋Š” DragEvent, DataTransfer, DataTransferItem, DataTransferItemList ์ž…๋‹ˆ๋‹ค.

DataTransfer ๊ฐ์ฒด๋Š” ๋“œ๋ž˜๊ทธ ํ˜•ํƒœ๋‚˜ ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ (ํ•˜๋‚˜ ์ด์ƒ์˜ ์•„์ดํ…œ), ๊ฐ ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์˜ ์ข…๋ฅ˜ (MIME ์ข…๋ฅ˜) ์™€ ๊ฐ™์€ ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ์˜ ์ƒํƒœ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DataTransfer ๋Š” ๋˜ํ•œ ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ์— ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. The DragEvent ์™€ DataTransfer ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ์œผ๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— HTML ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ Firefox๋Š” DataTransfer์— Gecko-specific extensions ์™€ ๊ฐ™์€ Firefox์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ํ™•์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

DataTransfer๋Š” DataTransferItem์˜ ๋ชฉ๋ก ์ธ items ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ DataTransferItem ๋Š” ํ•˜๋‚˜์˜ ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ๊ฐ ์•„์ดํ…œ์€ ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜ (string ํ˜น์€ file) ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” kind ํ”„๋กœํผํ‹ฐ์™€ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์˜ ์ข…๋ฅ˜ (MIME ์ข…๋ฅ˜) ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” type ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. DataTransferItem์€ ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

DataTransferItemList ๊ฐ์ฒด๋Š” DataTransferItem์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋Š” ์„ธ ๊ฐœ์˜ ๋ฉ”์†Œ๋“œ - ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋ฆฌ์ŠคํŠธ์—์„œ ์•„์ดํ…œ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“  ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์„ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์†Œ๋“œ - ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

A key difference between the DataTransfer and DataTransferItem interfaces is that the former uses the synchronous getData() method to access a drag item's data, whereas the later uses the asynchronous getAsString() method to access a drag item's data.

DataTransfer์™€ DataTransferItem์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ์ „์ž๋Š” ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐ ๋ฉ”์†Œ๋“œ์ธ getData()๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ฐ˜ํ•ด, ํ›„์ž๋Š” ๋น„๋™๊ธฐ ๋ฉ”์†Œ๋“œ์ธ getAsString()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์ฐธ๊ณ : DragEvent and DataTransfer๋Š” ์—ฌ๋Ÿฌ ๋ฐ์Šคํฌํƒ‘ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํญ๋„“๊ฒŒ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DataTransferItem์™€ DataTransferItemList๋Š” ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด Interoperability๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.

Gecko ํ•œ์ • ์ธํ„ฐํŽ˜์ด์Šค

Mozilla์™€ Firefox๋Š” ํ‘œ์ค€ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ชจ๋ธ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ช‡๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•„์ดํ…œ์„ ๋™์‹œ์— ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋“œ๋ž˜๊ทธ ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด, Dragging and Dropping Multiple Items์„ ๋ณด์‹ญ์‹œ์˜ค. ๋ง๋ถ™์—ฌ, ๋ชจ๋“  Gecko ํ•œ์ • ํ”„๋กœํผํ‹ฐ๋‚˜ Gecko ํ•œ์ • ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด DataTransfer ์ฐธ์กฐ ํŽ˜์ด์ง€๋„ ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ธฐ๋ณธ

์ด๋ฒˆ ์ ˆ์€ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์š”์•ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ ˆ์€ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๊ณ , ์งง์€ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์œ„ํ•œ ๋งํฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒƒ์ด draggable์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ draggable๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” draggable์™€ ondragstart ์ „์—ญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

js
function dragstart_handler(ev) {
  console.log("dragStart");
  // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด์— ๋Œ€์ƒ ์š”์†Œ์˜ id๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  ev.dataTransfer.setData("text/plain", ev.target.id);
}
html
<script>
  function dragstart_handler(ev) {
    // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด์— ๋Œ€์ƒ ์š”์†Œ์˜ id๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ev.dataTransfer.setData("text/plain", ev.target.id);
  }

  window.addEventListener("DOMContentLoaded", () => {
    // id๋ฅผ ํ†ตํ•ด element๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    const element = document.getElementById("p1");
    // 'dragstart' ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    element.addEventListener("dragstart", dragstart_handler);
  });
</script>

<p id="p1" draggable="true">This element is draggable.</p>

์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์œ„ํ•ด draggable attribute reference์™€ Drag operations guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ ์ •์˜ํ•˜๊ธฐ

๋“œ๋ž˜๊ทธํ•  ๋•Œ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์€ ํŠน์ • type์˜ ๋ฌธ์ž์—ด์ด๋ฉฐ, ๋ณดํ†ต text/html์™€ ๊ฐ™์€ MIME type์ž…๋‹ˆ๋‹ค.

๊ฐ drag event ์€ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” dataTransfer ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” (DataTransfer ๊ฐ์ฒด) ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. setData() ๋Š” ์•„๋ž˜ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์•„์ดํ…œ์„ ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
function dragstart_handler(ev) {
  // ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  ev.dataTransfer.setData("text/plain", ev.target.id);
  ev.dataTransfer.setData("text/html", "<p>Example paragraph</p>");
  ev.dataTransfer.setData("text/uri-list", "http://developer.mozilla.org");
}

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ๋ฐ์ดํ„ฐ ํƒ€์ž… (ํ…์ŠคํŠธ, HTML, ๋งํฌ, ํŒŒ์ผ ๋“ฑ) ์˜ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด, Recommended Drag Types๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ๋Š” Drag Data๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๋“œ๋ž˜๊ทธ ์ด๋ฏธ์ง€ ์ •์˜ํ•˜๊ธฐ

๋ธŒ๋ผ์šฐ์ €๋Š” ๋“œ๋ž˜๊ทธ ํ•˜๋Š” ๋™์•ˆ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ ์˜†์— ๋‚˜ํƒ€๋‚˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์›ํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด setDragImage()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
function dragstart_handler(ev) {
  // ๋“œ๋ž˜๊ทธ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  // ์ฐธ๊ณ : "example.gif"๋ฅผ ์กด์žฌํ•˜๋Š” ์ด๋ฏธ์ง€๋กœ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๋“œ๋ž˜๊ทธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  var img = new Image();
  img.src = "example.gif";
  ev.dataTransfer.setDragImage(img, 10, 10);
}

๋“œ๋ž˜๊ทธ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด, Setting the Drag Feedback Image๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋“œ๋ž˜๊ทธ ํšจ๊ณผ ์ •์˜ํ•˜๊ธฐ

dropEffect ํ”„๋กœํผํ‹ฐ๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋„์ค‘์— ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ (๋ณดํ†ต ์‹œ๊ฐ์ ์ธ) ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋“œ๋ž˜๊ทธ ํ•˜๋Š” ๋™์•ˆ ์–ด๋–ค ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๋Œ€์ƒ ๋“œ๋กญ ์š”์†Œ์— ์˜ฌ๋ ค๋†“์œผ๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋“œ๋ž˜๊ทธ ํšจ๊ณผ์— ์ ํ•ฉํ•œ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ธ ๊ฐœ์˜ ํšจ๊ณผ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

copy๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ๋“œ๋กญํ•˜๋Š” ์œ„์น˜๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋  ๊ฒƒ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

move๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ๋“œ๋กญํ•˜๋Š” ์œ„์น˜๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•  ๊ฒƒ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

link๋Š” ๋“œ๋ž˜๊ทธํ•˜๋Š” ์œ„์น˜์™€ ๋“œ๋กญํ•˜๋Š” ์œ„์น˜ ๊ฐ„์˜ ์ผ์ข…์˜ ๊ด€๊ณ„๋‚˜ ์—ฐ๊ฒฐ์ด ๋งบ์–ด์ง„ ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์œ„์น˜์—์„œ๋Š” ํŠน์ • ํšจ๊ณผ๊ฐ€ ํ—ˆ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋“œ๋ž˜๊ทธ ํ•˜๋Š” ๋„์ค‘์— ํšจ๊ณผ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ์œ„์น˜์— ๋“œ๋กญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์–ด๋–ป๊ฒŒ ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

js
function dragstart_handler(ev) {
  // ๋“œ๋ž˜๊ทธ ํšจ๊ณผ๋ฅผ copy๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  ev.dataTransfer.dropEffect = "copy";
}

๋” ์ž์„ธํ•œ ์„ค๋ช…์€ Drag Effects๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋“œ๋กญ ์ง€์—ญ ์ •์˜ํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ์š”์†Œ์— ๋ญ”๊ฐ€๋ฅผ ๋“œ๋กญํ–ˆ์„ ๋•Œ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์š”์†Œ๊ฐ€ ๋“œ๋กญ ์ง€์—ญ ํ˜น์€ droppable๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์š”์†Œ๊ฐ€ ondragover์™€ ondrop ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์†์„ฑ์„ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋‘ ์š”์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ ์š”์†Œ์— ํฌํ•จ๋œ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

html
<script>
  function dragover_handler(ev) {
    ev.preventDefault();
    // dropEffect๋ฅผ move๋กœ ์„ค์ •.
    ev.dataTransfer.dropEffect = "move";
  }
  function drop_handler(ev) {
    ev.preventDefault();
    // ๋Œ€์ƒ์˜ id๋ฅผ ๊ฐ€์ ธ์™€ ๋Œ€์ƒ DOM์— ์›€์ง์ธ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    const data = ev.dataTransfer.getData("text/plain");
    ev.target.appendChild(document.getElementById(data));
  }
</script>

<p
  id="target"
  ondrop="drop_handler(event)"
  ondragover="dragover_handler(event)">
  Drop Zone
</p>

๊ฐ ํ•ธ๋“ค๋Ÿฌ๋Š” preventDefault() ๋ฅผ ํ˜ธ์ถœํ•ด ์ถ”๊ฐ€์ ์ธ ์ด๋ฒคํŠธ (ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋‚˜ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ) ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋Š”, Specifying Drop Targets๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋“œ๋กญ ํšจ๊ณผ ๋‹ค๋ฃจ๊ธฐ

drop ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ž์œ ๋กญ๊ฒŒ ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต, ๋“œ๋ž˜๊ทธ ์•„์ดํ…œ๊ณผ ๊ฐ ์•„์ดํ…œ์„ ๊ฐ€๊ณตํ•˜๊ธฐ ์œ„ํ•ด getData()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, dropEffect ๊ฐ’์ด๋‚˜ ๋ณด์กฐํ‚ค ์ƒํƒœ์— ๋”ฐ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋“œ๋กญ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“œ๋ž˜๊ทธ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๋“œ๋ž˜๊ทธํ•˜๋Š” ์š”์†Œ์˜ id๋ฅผ ๊ฐ€์ ธ์™€ ๋“œ๋ž˜๊ทธํ•˜๋Š” ์š”์†Œ๋ฅผ ๋“œ๋กญํ•˜๋Š” ์š”์†Œ๋กœ ์˜ฎ๊ธฐ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

html
<script>
  function dragstart_handler(ev) {
    // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด์— ๋Œ€์ƒ ์š”์†Œ์˜ id๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ev.dataTransfer.setData("application/my-app", ev.target.id);
    ev.dataTransfer.dropEffect = "move";
  }
  function dragover_handler(ev) {
    ev.preventDefault();
    ev.dataTransfer.dropEffect = "move";
  }
  function drop_handler(ev) {
    ev.preventDefault();
    // ๋Œ€์ƒ์˜ id๋ฅผ ๊ฐ€์ ธ์™€ ์ด๋™ํ•œ ๋Œ€์ƒ DOM ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    // Get the id of the target and add the moved element to the target's DOM
    const data = ev.dataTransfer.getData("application/my-app");
    ev.target.appendChild(document.getElementById(data));
  }
</script>

<p id="p1" draggable="true" ondragstart="dragstart_handler(event)">
  This element is draggable.
</p>
<div
  id="target"
  ondrop="drop_handler(event)"
  ondragover="dragover_handler(event)">
  Drop Zone
</div>

๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด Performing a Drop์„ ๋ณด์‹ญ์‹œ์˜ค.

๋“œ๋ž˜๊ทธ๊ฐ€ ๋๋‚˜๋ฉด

๋“œ๋ž˜๊ทธ๊ฐ€ ๋๋‚˜๋ฉด ๋“œ๋ž˜๊ทธํ•œ ์š”์†Œ์— dragend ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” ๋“œ๋ž˜๊ทธ๊ฐ€ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ์ทจ์†Œ๋˜์–ด๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. dragend ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” dropEffect ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™•์ธํ•ด ๋“œ๋ž˜๊ทธ๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋ž˜๊ทธ ๋์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” Finishing a Drag๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ƒํ˜ธ ์šด์šฉ์„ฑ

DataTransferItem interface's Browser Compatibility table์— ๋‚˜์˜จ ๋Œ€๋กœ, ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํญ๋„“๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (DataTransferItem๋Š” DataTransferItemList ๋œ ์ง€์›ํ•˜์ง€๋งŒ). ๋˜ํ•œ ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๋งค์šฐ ํ•œ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ์™€ ๋ฐ๋ชจ

๋ช…์„ธ์„œ

Specification
HTML

๋”๋ณด๊ธฐ