Kích hoạt phần tử có thể kéo - thả

Tính năng kéo thả có thể áp dụng cho mọi phần tử HTML, mục đích để 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ụ:

<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:

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:

<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:

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:

<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:

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:

<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ế hợp lại để chúng hoạt động chính xác thành một nội dung như sau:

<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


Logo Google

Đăng ký theo dõi ủng hộ kênh