Vấn đề tôi gặp phải là dragleave
sự kiện của một phần tử được kích hoạt khi di chuột một phần tử con của phần tử đó. Ngoài ra, dragenter
không được bắn khi di chuột trở lại phần tử cha.
Tôi đã thực hiện một fiddle đơn giản hóa: http://jsfiddle.net/pimvdb/HU6Mk/1/ .
HTML:
<div id="drag" draggable="true">drag me</div>
<hr>
<div id="drop">
drop here
<p>child</p>
parent
</div>
với JavaScript sau:
$('#drop').bind({
dragenter: function() {
$(this).addClass('red');
},
dragleave: function() {
$(this).removeClass('red');
}
});
$('#drag').bind({
dragstart: function(e) {
e.allowedEffect = "copy";
e.setData("text/plain", "test");
}
});
Những gì nó được cho là làm là thông báo cho người dùng bằng cách làm cho div
màu đỏ rơi khi kéo một cái gì đó ở đó. Điều này hoạt động, nhưng nếu bạn kéo vào p
đứa trẻ, dragleave
nó sẽ bị bắn và div
không còn màu đỏ nữa. Di chuyển trở lại thả div
cũng không làm cho nó đỏ trở lại. Nó là cần thiết để di chuyển hoàn toàn ra khỏi thả div
và kéo trở lại vào nó một lần nữa để làm cho nó màu đỏ.
Có thể ngăn không cho dragleave
bắn khi kéo vào một phần tử con?
Cập nhật 2017: TL; DR, Tra cứu CSS pointer-events: none;
như được mô tả trong câu trả lời của @ HD bên dưới hoạt động trong các trình duyệt hiện đại và IE11.
dragleave
vẫn bị bắn trong trường hợp đó.