個人向け収支追跡アプリケーションの強化

JavaScriptJavaScriptBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、アレックスの個人向けの収支追跡アプリケーションの開発が進み、高度なイベントハンドリング技術を使ってアプリケーションのインタラクティビティを向上させる段階に入ります。シーンは、テックスタートアップのブレインストーミングセッションで設定されており、アレックスは収支記録を並べ替えるためのドラッグアンドドロップ機能の追加を提案しています。この野心的な目標は、ユーザーに記録を整理する直感的な方法を提供し、個人向けの収支管理の流動的な性質を反映しています。これを達成するには、アレックスが高度なDOMイベントを探索し、視覚的に魅力的でユーザーフレンドリーな方法で要素を操作する必要があります。

この実験では、JavaScriptにおける高度なイベントハンドリングに深く突き込み、リスト内の項目を動的に並べ替えるためのドラッグアンドドロップ機能を実装する方法を学びます。このスキルは、ユーザーエクスペリエンスを重視した現代的なインタラクティブなWebアプリケーションを作成するために非常に重要です。

ポイント

  • ドラッグアンドドロップAPI (dragstart, dragover, drop)

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/DOMManipulationGroup(["DOM Manipulation"]) javascript/DOMManipulationGroup -.-> javascript/dom_select("DOM Selection") javascript/DOMManipulationGroup -.-> javascript/dom_manip("DOM Manipulation") javascript/DOMManipulationGroup -.-> javascript/event_handle("Event Handling") subgraph Lab Skills javascript/dom_select -.-> lab-290731{{"個人向け収支追跡アプリケーションの強化"}} javascript/dom_manip -.-> lab-290731{{"個人向け収支追跡アプリケーションの強化"}} javascript/event_handle -.-> lab-290731{{"個人向け収支追跡アプリケーションの強化"}} end

DragEvent

DragEvent は、ドラッグアンドドロップ操作を処理するためのイベントインターフェイスです。これは MouseEvent から拡張されており、すべてのマウスイベントプロパティに加え、ドラッグアンドドロップ操作固有の追加プロパティも含んでいます。

ドラッグアンドドロップの設定

要素をドラッグ可能にするには、その draggable 属性を true に設定する必要があります。その後、ドラッグアンドドロップイベントを処理するためのイベントリスナーを追加できます。

<div id="drag-item" draggable="true">Drag me</div>

または

setAttribute("draggable", true);

ドラッグアンドドロップイベントの処理

ドラッグアンドドロップ操作には、dragstartdragdragenddragenterdragoverdragleave、および 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>
Drag and drop demonstration

ドロップの処理

要素がドロップされたアイテムを受け取るようにするには、dragoverdrop イベントを処理する必要があります。

たとえば:

<!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>
Drag and drop demonstration

並べ替え用のドラッグアンドドロップの実装

このステップでは、あなたとアレックスは、ユーザーがドラッグアンドドロップを使って収支記録を並べ替える機能を追加することで、個人向けの収支追跡アプリケーションを強化します。これには、いくつかのイベントをキャプチャすることが必要です。dragstartdragoverdrop で、そしてDOMがそれに応じて更新されることを確認します。

まず、script.jsrenderFinancialRecords 関数を変更して、各記録をドラッグ可能にし、これらのイベントを処理します。

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アプリケーションを構築するために不可欠です。