Vấn đề tôi gặp phải là dragleavesự 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, dragenterkhô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 divmà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ẻ, dragleavenó sẽ bị bắn và divkhông còn màu đỏ nữa. Di chuyển trở lại thả divcũ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ả divvà 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 dragleavebắ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.
dragleavevẫn bị bắn trong trường hợp đó.