Tìm hiểu tính năng drag và drop (kéo thả) trong HTML5

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,829
Được Like
12,687
Tìm hiểu tính năng drag và drop (kéo thả) trong HTML5

Nếu bạn muốn sử dụng tính năng kéo thả thì drag và drop trong HTML5 có thể hỗ trợ bạn.

Tính năng kéo thả có thể áp dụng cho mọi phần tử HTML, mục đích là để dịch chuyển phần tử từ vị trí này sang vị trí khác hay để thu thập dữ liệu.

Phần tử nào muốn có khả năng kéo (drag) đơn giản thêm vào phần tử đó thuộc tính: draggable="true"

Ví dụ:
Mã:
<img draggable="true" />

Các hàm API về kéo và thả trong HTML5 dựa trên các hàm về sự kiện

Kéo cái gì - Drag
Khi một phần tử được kéo, nó sẽ gọi hàm được chỉ ra trong thuộc tính ondragstart="function_name(event)", dữ liệu sự kiện event trong tham số hàm có chứa dữ liệu phần tử được kéo và gọi phương thức event.dataTransfer.setData() để lưu lại

Ví dụ xây dựng hàm có tên drag(ev) làm nhiệm vụ này:
Mã:
function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

Hàm trên cho biết dữ liệu kéo thiết lập là kiểu "text" và trong nó lưu trữ ID của phần tử (divdrag). Có hàm đó rồi có thể áp dụng vào phần tử muốn kéo, ví dụ kích hoạt phần tử div có id là divdrag có khả năng kéo:
Mã:
<div draggable="true" ondragstart="drag(event)" id="divdrag">
    <img  src="https://www.google.com.vn/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" draggable="false"/>
    <p>Logo Google</p>
</div>

Thả vào đâu (drop)
Khi dữ liệu được thả vào một phần tử nào đó, thì sự kiện drop sẽ phát sinh. Mặc định thì dữ liệu hay phần tử này không có phép thả lên phần tử khác. Nên muốn cho phép thả vào một phần tử thì cần gọi phương thức event.preventDefault() thiết lập tại thuộc tính ondragover.

Xây dựng hàm có tên allowDrop dùng để thiết lập cho phép phần tử chấp nhận phần tử khác thả vào:
Mã:
function allowDrop(ev) {
    ev.preventDefault();
}

Sau khi có hàm allowDrop như trên thì phần tử nào muốn thiết lập cho phép thả vào thì thêm thuộc tính là ondragover="allowDrop(event)". Ví dụ, box sau cho phép thả vào:
Mã:
<div id="box"
     ondragover="allowDrop(event)"
     style="border:1px solid black; width:200px; height:200px">
</div>

Xử lý thả phần tử (drop)
Khi dữ liệu thả vào một phần tử, sự kiện thả sẽ diễn ra và nó sẽ gọi hàm thiết lập trong thuộc tính ondrop. Ví dụ xây dựng hàm để xử lý sự kiện này và lấy dữ liệu thả vào:

Giả sử đặt tên hàm là drop, có thể xây dựng hàm như sau:
Mã:
function drop(ev) {
    
    //Gọi hàm này để ngăn cản browser xử lý mặc định sự kiện drop (ví dụ mở link)
    ev.preventDefault();
    
    //Lấy dữ liệu text thả vào - chính là ID phần tử kéo đã lưu ở trên
    var data = ev.dataTransfer.getData("text");
    
    //Di chuyển phần tử kéo vào phần tử thả
    ev.target.appendChild(document.getElementById(data));
}

Sau khi có hàm drop thiết lập phần tử với thuộc tính ondrop dạng như sau:
Mã:
<div id="box"
     ondrop="drop(event)"
     ondragover="allowDrop(event)"
</div>

Kết hợp toàn bộ mã kéo thả
Toàn bộ các đoạn code về kéo thả trên bạn có thể kết
Mã:
<script>
    function allowDrop(ev) {
        ev.preventDefault();
    }

    function drag(ev) {
        ev.dataTransfer.setData("text", ev.target.id);
    }

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(data));
    }
</script>

<div id="box"
     ondrop="drop(event)"
     ondragover="allowDrop(event)"
     style="border:1px solid black; width:200px; height:200px">
</div>

<hr/>

<div draggable="true" ondragstart="drag(event)" id="divdrag">
    <img  src="https://www.google.com.vn/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" draggable="false"/>
    <p>Logo Google</p>
</div>

Giờ chạy code trên, bạn đã có thể kéo thẻ div có chứa logo google vào box
hợp lại để chúng hoạt động chính xác thành một nội dung như sau:

screenshot_1590457975.png


screenshot_1590457951.png

Chúc các bạn thành công.


Nguồn: Internet​
 

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mobile/Zalo: 0906081284

Telegram: anhanhxf

Chỉ nhận web nội dung lành mạnh

Nhà Tài Trợ

Mút Xốp Không Gian
Mút Sofa Không Gian
Top Bottom