はじめに
この実験では、アレックスの個人向けの収支追跡アプリケーションの開発が進み、高度なイベントハンドリング技術を使ってアプリケーションのインタラクティビティを向上させる段階に入ります。シーンは、テックスタートアップのブレインストーミングセッションで設定されており、アレックスは収支記録を並べ替えるためのドラッグアンドドロップ機能の追加を提案しています。この野心的な目標は、ユーザーに記録を整理する直感的な方法を提供し、個人向けの収支管理の流動的な性質を反映しています。これを達成するには、アレックスが高度な DOM イベントを探索し、視覚的に魅力的でユーザーフレンドリーな方法で要素を操作する必要があります。
この実験では、JavaScript における高度なイベントハンドリングに深く突き込み、リスト内の項目を動的に並べ替えるためのドラッグアンドドロップ機能を実装する方法を学びます。このスキルは、ユーザーエクスペリエンスを重視した現代的なインタラクティブな Web アプリケーションを作成するために非常に重要です。
ポイント:
- ドラッグアンドドロップ API (
dragstart,dragover,drop)
DragEvent
DragEvent は、ドラッグアンドドロップ操作を処理するためのイベントインターフェイスです。これは MouseEvent から拡張されており、すべてのマウスイベントプロパティに加え、ドラッグアンドドロップ操作固有の追加プロパティも含んでいます。
ドラッグアンドドロップの設定
要素をドラッグ可能にするには、その draggable 属性を true に設定する必要があります。その後、ドラッグアンドドロップイベントを処理するためのイベントリスナーを追加できます。
<div id="drag-item" draggable="true">Drag me</div>
または
setAttribute("draggable", true);
ドラッグアンドドロップイベントの処理
ドラッグアンドドロップ操作には、dragstart、drag、dragend、dragenter、dragover、dragleave、および drop などのいくつかのイベントが関係します。
dragstart:ユーザーが要素をドラッグを開始したときにトリガーされます。drag:要素がドラッグされている間、連続的にトリガーされます。dragend:ドラッグアンドドロップ操作が終了したときにトリガーされます。
たとえば、要素にイベントリスナーを追加する場合:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Drag and Drop Example</title>
<style>
#drag-item {
width: 100px;
height: 100px;
background-color: rgb(87, 196, 238);
color: white;
line-height: 100px;
text-align: center;
margin-bottom: 10px;
cursor: pointer;
}
#drop-zone {
width: 200px;
height: 100px;
background-color: rgb(214, 210, 210);
line-height: 100px;
text-align: center;
}
</style>
</head>
<body>
<div id="drag-item" draggable="true">Drag me</div>
<div id="drop-zone">Drop here</div>
<script>
const dragItem = document.getElementById("drag-item");
dragItem.addEventListener("dragstart", function (event) {
// ドラッグデータを設定
event.dataTransfer.setData(
"text/plain",
"This is the data being dragged"
);
});
dragItem.addEventListener("dragend", function (event) {
// ドラッグ終了後の操作
console.log("Drag ended");
});
</script>
</body>
</html>

ドロップの処理
要素がドロップされたアイテムを受け取るようにするには、dragover と drop イベントを処理する必要があります。
たとえば:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Drag and Drop Example</title>
<style>
#drag-item {
width: 100px;
height: 100px;
background-color: rgb(87, 196, 238);
color: white;
line-height: 100px;
text-align: center;
margin-bottom: 10px;
cursor: pointer;
}
#drop-zone {
width: 200px;
height: 100px;
background-color: rgb(214, 210, 210);
line-height: 100px;
text-align: center;
}
</style>
</head>
<body>
<div id="drag-item" draggable="true">Drag me</div>
<div id="drop-zone">Drop here</div>
<script>
// JavaScript code goes here
const dragItem = document.getElementById("drag-item");
const dropZone = document.getElementById("drop-zone");
// ドラッグ開始イベント
dragItem.addEventListener("dragstart", function (event) {
event.dataTransfer.setData("text/plain", "Drag Successful");
});
// ドラッグオーバーイベント
dropZone.addEventListener("dragover", function (event) {
event.preventDefault(); // ドロップを許可するために必要
});
// ドロップイベント
dropZone.addEventListener("drop", function (event) {
event.preventDefault();
const data = event.dataTransfer.getData("text/plain");
console.log("Dropped data:", data);
dropZone.textContent = `Dropped: ${data}`;
});
</script>
</body>
</html>

並べ替え用のドラッグアンドドロップの実装
このステップでは、あなたとアレックスは、ユーザーがドラッグアンドドロップを使って収支記録を並べ替える機能を追加することで、個人向けの収支追跡アプリケーションを強化します。これには、いくつかのイベントをキャプチャすることが必要です。dragstart、dragover、drop で、そして DOM がそれに応じて更新されることを確認します。
まず、script.js の renderRecords 関数を変更して、各記録をドラッグ可能にし、これらのイベントを処理します。
document.addEventListener("DOMContentLoaded", function () {
const renderRecords = () => {
recordsList.innerHTML = "";
records.forEach((record, index) => {
const recordElement = document.createElement("div");
recordElement.setAttribute("draggable", true);
recordElement.classList.add("record-item");
recordElement.innerHTML = `
${record.description} - ${record.amount} (${record.type}) <button onclick="deleteRecord(${index})">Delete</button>
`;
recordElement.addEventListener("dragstart", (e) => {
draggedIndex = index;
});
recordElement.addEventListener("dragover", (e) => {
e.preventDefault();
});
recordElement.addEventListener("drop", (e) => {
const temp = records[draggedIndex];
records[draggedIndex] = records[index];
records[index] = temp;
saveRecords();
});
recordsList.appendChild(recordElement);
});
};
});
この実装により、ユーザーは収支記録をドラッグしてリスト内の新しい位置にドロップすることができ、アプリケーションは自動的に記録の順序を更新します。
まとめ
この実験では、あなたはアレックスとの旅を通じて、個人向けの収支追跡アプリケーションに高度な機能を成功裏に実装しました。すなわち、収支記録を並べ替えるためのドラッグアンドドロップ機能です。この強化は、アプリケーションの使いやすさを向上させるだけでなく、Web 開発における複雑なイベントハンドリングと動的な UI 更新にもあなたを導きます。このプロセスを通じて、あなたは高度な方法でユーザーのアクションに応答するインタラクティブで直感的な Web アプリケーションを作成するための貴重な洞察を得ました。
ドラッグアンドドロップのような高度なイベントハンドリング技術を探索することで、Web 開発者としてのあなたのツールキットが拡張され、より複雑な UI/UX の課題に取り組むことができるようになりました。この知識は、今日のユーザーがインタラクティビティと応答性に対して抱く高い期待を満たす現代の Web アプリケーションを構築するために不可欠です。



