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
์ ์ญ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์๋ ์์ ์ฝ๋์ ๊ฐ์ด ์ถ๊ฐํด์ผํฉ๋๋ค.
function dragstart_handler(ev) {
console.log("dragStart");
// ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด์ ๋์ ์์์ id๋ฅผ ์ถ๊ฐํฉ๋๋ค.
ev.dataTransfer.setData("text/plain", ev.target.id);
}
<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()
๋ ์๋ ์ฝ๋ ์์ ์ ๊ฐ์ด ์์ดํ
์ ๋๋๊ทธ ๋ฐ์ดํฐ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
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()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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
๋ ๋๋๊ทธํ๋ ์์น์ ๋๋กญํ๋ ์์น ๊ฐ์ ์ผ์ข
์ ๊ด๊ณ๋ ์ฐ๊ฒฐ์ด ๋งบ์ด์ง ๋ค๋ ๊ฒ์ ์์ํฉ๋๋ค.
ํน์ ์์น์์๋ ํน์ ํจ๊ณผ๊ฐ ํ์ฉ๋๋ค๋ ๊ฒ์ ์๋ ค์ฃผ๊ธฐ ์ํด ๋๋๊ทธ ํ๋ ๋์ค์ ํจ๊ณผ๊ฐ ๋ณํ ์ ์์ต๋๋ค. ํ์ฉ๋๋ ๊ฒฝ์ฐ์๋ง ํด๋น ์์น์ ๋๋กญํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ ์ด๋ป๊ฒ ์ด ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋์ง ๋ณด์ฌ์ค๋๋ค.
function dragstart_handler(ev) {
// ๋๋๊ทธ ํจ๊ณผ๋ฅผ copy๋ก ์ง์ ํฉ๋๋ค.
ev.dataTransfer.dropEffect = "copy";
}
๋ ์์ธํ ์ค๋ช ์ Drag Effects๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋๋กญ ์ง์ญ ์ ์ํ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ธ๋ผ์ฐ์ ๋ HTML ์์์ ๋ญ๊ฐ๋ฅผ ๋๋กญํ์ ๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๋๋ก ํฉ๋๋ค. ํน์ ์์๊ฐ ๋๋กญ ์ง์ญ ํน์ droppable๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ํด๋น ์์๊ฐ ondragover
์ ondrop
์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ฑ์ ๊ฐ์ ธ์ผํฉ๋๋ค. ์๋ ์์ ๋ ๋ ์์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ , ๊ฐ ์์์ ํฌํจ๋ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
<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๋ฅผ ๊ฐ์ ธ์ ๋๋๊ทธํ๋ ์์๋ฅผ ๋๋กญํ๋ ์์๋ก ์ฎ๊ธฐ๊ธฐ์ํด ์ฌ์ฉํฉ๋๋ค.
<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
๋ ์ง์ํ์ง๋ง). ๋ํ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์๋ ๋งค์ฐ ํ์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ ๋ฐ๋ชจ
- Copying and moving elements with the
DataTransfer
interface - Copying and moving elements with the
DataTransferListItem
interface - ํ์ผ ๋๋๊ทธ ์ค ๋๋กญ; Firefox ์ ์ฉ: https://jsfiddle.net/9C2EF/
- ํ์ผ ๋๋๊ทธ ์ค ๋๋กญ; ๋ชจ๋ ๋ธ๋ผ์ฐ์ : https://jsbin.com/hiqasek/
๋ช ์ธ์
Specification |
---|
HTML |