メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

HTML5 Drag and Drop API

บทนี้กล่าวถึงการใช้ HTML5 Drag and Drop API เพื่อสร้างฟังก์ชันการลากและวางบนเว็บไซต์ โดยอธิบายถึงขั้นตอนพื้นฐาน เช่น การตั้งค่า `draggable` attribute, การจัดการ...

HTML5 Drag and Drop API

ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับการสร้างฟังก์ชันการลากและวาง (Drag and Drop) บนเว็บไซต์ของเรา โดยใช้ HTML5 Drag and Drop API ซึ่งเป็นเครื่องมือที่มีประสิทธิภาพและใช้งานง่ายในการสร้างประสบการณ์ผู้ใช้ที่น่าสนใจและโต้ตอบได้

Drag and Drop API ช่วยให้ผู้ใช้สามารถเลือกองค์ประกอบ (element) บนหน้าเว็บและลากไปยังตำแหน่งอื่น ไม่ว่าจะเป็นภายในหน้าเดียวกัน หรือไปยังแอปพลิเคชันอื่นที่รองรับการลากและวาง

พื้นฐานของ HTML5 Drag and Drop API

การใช้งาน Drag and Drop API ประกอบด้วยขั้นตอนหลักๆ ดังนี้:

  1. การตั้งค่า `draggable` attribute: กำหนดให้องค์ประกอบ HTML ใดๆ สามารถถูกลากได้
  2. การจัดการ Event Handlers: ใช้ JavaScript เพื่อจัดการเหตุการณ์ (events) ที่เกิดขึ้นระหว่างกระบวนการลากและวาง
  3. การป้องกัน Default Behavior: ป้องกันการทำงานเริ่มต้นของเบราว์เซอร์ที่อาจขัดขวางการทำงานของ Drag and Drop API
  4. การถ่ายโอนข้อมูล: ส่งข้อมูลระหว่างองค์ประกอบที่ถูกลากและองค์ประกอบที่รับการวาง

1. การตั้งค่า `draggable` Attribute

เริ่มต้นด้วยการกำหนดให้องค์ประกอบ HTML ที่เราต้องการให้สามารถลากได้ มี attribute ชื่อ `draggable` และตั้งค่าเป็น `true`

<div id="draggableElement" draggable="true">
  ลากฉันสิ!
</div>

ในตัวอย่างนี้ `<div>` ที่มี id เป็น `draggableElement` จะสามารถถูกลากได้

2. Event Handlers ที่เกี่ยวข้อง

Drag and Drop API มี event handlers หลายตัวที่ช่วยให้เราควบคุมกระบวนการลากและวางได้อย่างละเอียด Event handlers ที่สำคัญมีดังนี้:

  • `dragstart`: เกิดขึ้นเมื่อผู้ใช้เริ่มลากองค์ประกอบ
  • `dragenter`: เกิดขึ้นเมื่อองค์ประกอบที่ถูกลากเข้าสู่พื้นที่ขององค์ประกอบเป้าหมาย
  • `dragover`: เกิดขึ้นเมื่อองค์ประกอบที่ถูกลากอยู่เหนือองค์ประกอบเป้าหมาย (เหตุการณ์นี้จะเกิดขึ้นซ้ำๆ)
  • `drop`: เกิดขึ้นเมื่อผู้ใช้วางองค์ประกอบที่ถูกลากลงบนองค์ประกอบเป้าหมาย
  • `dragend`: เกิดขึ้นเมื่อการลากสิ้นสุดลง ไม่ว่าผู้ใช้จะวางองค์ประกอบหรือไม่ก็ตาม
  • `dragleave`: เกิดขึ้นเมื่อองค์ประกอบที่ถูกลากออกจากพื้นที่ขององค์ประกอบเป้าหมาย

เราสามารถใช้ JavaScript เพื่อเพิ่ม event listeners ให้กับองค์ประกอบที่เกี่ยวข้องและจัดการเหตุการณ์เหล่านี้

ตัวอย่างการใช้งาน Event Handlers

const draggableElement = document.getElementById('draggableElement');
const dropTarget = document.getElementById('dropTarget');

draggableElement.addEventListener('dragstart', (event) => {
  console.log('เริ่มลาก!');
  // กำหนดข้อมูลที่จะส่งระหว่างการลาก
  event.dataTransfer.setData('text/plain', draggableElement.id);
});

dropTarget.addEventListener('dragenter', (event) => {
  console.log('เข้าสู่พื้นที่เป้าหมาย');
  // ป้องกัน default behavior เพื่อให้สามารถวางได้
  event.preventDefault();
});

dropTarget.addEventListener('dragover', (event) => {
  // ป้องกัน default behavior เพื่อให้สามารถวางได้
  event.preventDefault();
});

dropTarget.addEventListener('drop', (event) => {
  console.log('วาง!');
  // ป้องกัน default behavior
  event.preventDefault();

  // ดึงข้อมูลที่ถูกส่งมา
  const data = event.dataTransfer.getData('text/plain');
  const draggedElement = document.getElementById(data);

  // ย้ายองค์ประกอบที่ถูกลากไปยังเป้าหมาย
  dropTarget.appendChild(draggedElement);
});

draggableElement.addEventListener('dragend', (event) => {
  console.log('สิ้นสุดการลาก');
});

และ HTML ที่เกี่ยวข้อง:

<div id="draggableElement" draggable="true">
  ลากฉันสิ!
</div>

<div id="dropTarget" style="border: 2px dashed #ccc; padding: 20px;">
  วางที่นี่!
</div>

ในตัวอย่างนี้:

  • เราเพิ่ม event listeners สำหรับ `dragstart`, `dragenter`, `dragover`, `drop` และ `dragend` ให้กับองค์ประกอบ `draggableElement` และ `dropTarget`
  • ใน `dragstart` เราใช้ `event.dataTransfer.setData()` เพื่อกำหนดข้อมูลที่จะส่งระหว่างการลาก ในที่นี้เราส่ง id ขององค์ประกอบที่ถูกลาก
  • ใน `dragenter` และ `dragover` เราเรียก `event.preventDefault()` เพื่อป้องกัน default behavior ของเบราว์เซอร์ ซึ่งจะทำให้เราสามารถวางองค์ประกอบได้
  • ใน `drop` เราดึงข้อมูลที่ถูกส่งมาด้วย `event.dataTransfer.getData()` และใช้เพื่อดึงองค์ประกอบที่ถูกลาก จากนั้นเราก็ย้ายองค์ประกอบนั้นไปยัง `dropTarget`

3. การป้องกัน Default Behavior

เบราว์เซอร์มี default behavior สำหรับบางเหตุการณ์ที่เกี่ยวข้องกับการลากและวาง เช่น การเปิดลิงก์เมื่อมีการลากไฟล์ไปยังหน้าเว็บ การป้องกัน default behavior เป็นสิ่งสำคัญเพื่อให้ Drag and Drop API ทำงานได้อย่างถูกต้อง

เราสามารถป้องกัน default behavior ได้โดยการเรียกใช้ `event.preventDefault()` ใน event handlers ที่เกี่ยวข้อง โดยเฉพาะอย่างยิ่งใน `dragenter` และ `dragover` event handlers

dropTarget.addEventListener('dragenter', (event) => {
  event.preventDefault(); // ป้องกัน default behavior
});

dropTarget.addEventListener('dragover', (event) => {
  event.preventDefault(); // ป้องกัน default behavior
});

4. การถ่ายโอนข้อมูล

Drag and Drop API อนุญาตให้เราส่งข้อมูลระหว่างองค์ประกอบที่ถูกลากและองค์ประกอบที่รับการวาง ข้อมูลนี้สามารถเป็นอะไรก็ได้ เช่น ข้อความ, HTML, หรือแม้แต่ข้อมูลที่ซับซ้อนในรูปแบบ JSON

เราใช้ `event.dataTransfer` object เพื่อจัดการการถ่ายโอนข้อมูล:

  • `setData(format, data)`: กำหนดข้อมูลที่จะส่ง โดย `format` คือชนิดของข้อมูล (เช่น `text/plain`, `text/html`, `application/json`) และ `data` คือข้อมูลที่จะส่ง
  • `getData(format)`: ดึงข้อมูลที่ถูกส่งมา โดย `format` คือชนิดของข้อมูลที่ต้องการดึง

ตัวอย่างการถ่ายโอนข้อมูล

draggableElement.addEventListener('dragstart', (event) => {
  // ส่งข้อมูลเป็นข้อความธรรมดา
  event.dataTransfer.setData('text/plain', draggableElement.textContent);

  // ส่งข้อมูลเป็น HTML
  event.dataTransfer.setData('text/html', draggableElement.outerHTML);

  // ส่งข้อมูลเป็น JSON
  const data = { name: 'Example', value: 123 };
  event.dataTransfer.setData('application/json', JSON.stringify(data));
});

dropTarget.addEventListener('drop', (event) => {
  event.preventDefault();

  // ดึงข้อมูลเป็นข้อความธรรมดา
  const plainText = event.dataTransfer.getData('text/plain');
  console.log('ข้อความธรรมดา:', plainText);

  // ดึงข้อมูลเป็น HTML
  const html = event.dataTransfer.getData('text/html');
  console.log('HTML:', html);

  // ดึงข้อมูลเป็น JSON
  const jsonData = JSON.parse(event.dataTransfer.getData('application/json'));
  console.log('JSON:', jsonData);
});

ในตัวอย่างนี้ เราได้ส่งข้อมูลในสามรูปแบบที่แตกต่างกัน: ข้อความธรรมดา, HTML และ JSON เมื่อองค์ประกอบถูกลาก เราใช้ `setData()` เพื่อกำหนดข้อมูลที่จะส่ง และเมื่อองค์ประกอบถูกวาง เราใช้ `getData()` เพื่อดึงข้อมูลที่ถูกส่งมา

ตัวอย่างการใช้งานขั้นสูง: การลากและวางไฟล์

Drag and Drop API ยังสามารถใช้สำหรับการลากและวางไฟล์จากระบบปฏิบัติการไปยังหน้าเว็บได้

<div id="dropArea" style="border: 2px dashed #ccc; padding: 20px;">
  วางไฟล์ที่นี่!
</div>
const dropArea = document.getElementById('dropArea');

dropArea.addEventListener('dragover', (event) => {
  event.preventDefault();
  dropArea.style.backgroundColor = '#eee';
});

dropArea.addEventListener('dragleave', (event) => {
  dropArea.style.backgroundColor = '';
});

dropArea.addEventListener('drop', (event) => {
  event.preventDefault();
  dropArea.style.backgroundColor = '';

  const files = event.dataTransfer.files;

  for (let i = 0; i < files.length; i++) {
    const file = files[i];
    console.log('ชื่อไฟล์:', file.name);
    console.log('ชนิดไฟล์:', file.type);
    console.log('ขนาดไฟล์:', file.size);

    // สามารถอ่านเนื้อหาของไฟล์ได้โดยใช้ FileReader API
    const reader = new FileReader();

    reader.onload = (event) => {
      console.log('เนื้อหาของไฟล์:', event.target.result);
    };

    reader.readAsText(file); // อ่านไฟล์เป็นข้อความ
  }
});

ในตัวอย่างนี้:

  • เราป้องกัน default behavior ใน `dragover` เพื่อให้สามารถวางไฟล์ได้
  • เราเข้าถึงไฟล์ที่ถูกวางโดยใช้ `event.dataTransfer.files` ซึ่งเป็น `FileList` object
  • เราวนลูปผ่านไฟล์แต่ละไฟล์และเข้าถึงคุณสมบัติของไฟล์ เช่น ชื่อ, ชนิด และขนาด
  • เราใช้ `FileReader` API เพื่ออ่านเนื้อหาของไฟล์

ข้อควรระวัง

  • ความเข้ากันได้ของเบราว์เซอร์: HTML5 Drag and Drop API ได้รับการสนับสนุนอย่างกว้างขวางในเบราว์เซอร์สมัยใหม่ แต่ควรตรวจสอบความเข้ากันได้สำหรับเบราว์เซอร์รุ่นเก่า
  • ประสิทธิภาพ: การจัดการเหตุการณ์ `dragover` อาจส่งผลต่อประสิทธิภาพของหน้าเว็บ หากมีการประมวลผลที่ซับซ้อนภายใน event handler ควรพิจารณาการจำกัดอัตราการเรียกใช้งาน (throttling)
  • ความปลอดภัย: เมื่อรับข้อมูลที่ถูกส่งมา ควรตรวจสอบและทำความสะอาดข้อมูลเพื่อป้องกันการโจมตี XSS (Cross-Site Scripting)

สรุป

HTML5 Drag and Drop API เป็นเครื่องมือที่มีประสิทธิภาพในการสร้างประสบการณ์ผู้ใช้ที่น่าสนใจและโต้ตอบได้ การเข้าใจ event handlers ที่เกี่ยวข้อง การป้องกัน default behavior และการถ่ายโอนข้อมูลเป็นสิ่งสำคัญสำหรับการใช้งาน API นี้อย่างมีประสิทธิภาพ

ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับ HTML Accessibility (A11y) ขั้นสูง เพื่อให้เว็บไซต์ของเราสามารถเข้าถึงได้ง่ายสำหรับผู้ใช้งานทุกคน รวมถึงผู้ที่มีความพิการ

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る