Raahaa minua
Pudota tähän
CSS
/* Esikatselualue määrittelee sekä taustan että tekstin värin, jotta pari on varmasti luettava kummassakin teemassa. */ #alue { background-color: #ffffff; color: #1a1a1a; padding: 0.5rem; } @media (prefers-color-scheme: dark) { #alue { background-color: #1e1e1e; color: #f0f0f0; } } #lahde { display: inline-block; padding: 0.5rem 1rem; border: 2px solid currentColor; cursor: grab; } #kohde { margin-top: 1rem; padding: 2rem; border: 2px dashed currentColor; }
HTML
<div id="alue"> <p id="lahde" draggable="true">Raahaa minua</p> <div id="kohde">Pudota tähän</div> </div>
Javascript
/* suorita tämä koodi Run-painikkeella */ /* Koodikoneen Run-painike suorittaa koodin uudelleen, jolloin samat käsittelijät liitettäisiin toistamiseen. Siksi elementit korvataan kopioillaan: kopio ei peri tapahtumankäsittelijöitä. */ const puhdista = function (elementti) { const kopio = elementti.cloneNode(true); elementti.replaceWith(kopio); return kopio; }; const lahde = puhdista(document.getElementById("lahde")); const kohde = puhdista(document.getElementById("kohde")); lahde.addEventListener("dragstart", function (e) { e.dataTransfer.setData("text/plain", "Hei maailma"); console.log("dragstart"); }); /* KOKEILE: kommentoi seuraava preventDefault pois ja aja uudelleen. Pudotus ei enää onnistu, eikä drop-tapahtumaa tule lainkaan. Selaimen oletustoiminto on KIELTÄÄ pudotus. */ kohde.addEventListener("dragover", function (e) { e.preventDefault(); }); kohde.addEventListener("drop", function (e) { e.preventDefault(); kohde.textContent = e.dataTransfer.getData("text/plain"); console.log("drop"); }); /* dragend laukeaa aina, myös kun raahaus keskeytyy */ lahde.addEventListener("dragend", function () { console.log("dragend"); });
Konsoli