Tổng quat
Tôi có cấu trúc HTML sau đây và tôi đã đính kèm dragenter
và dragleave
các sự kiện vào thành <div id="dropzone">
phần.
<div id="dropzone">
<div id="dropzone-content">
<div id="drag-n-drop">
<div class="text">this is some text</div>
<div class="text">this is a container with text and images</div>
</div>
</div>
</div>
Vấn đề
Khi tôi kéo một tập tin qua <div id="dropzone">
, dragenter
sự kiện sẽ được kích hoạt như mong đợi. Tuy nhiên, khi tôi di chuyển chuột qua một phần tử con, chẳng hạn như <div id="drag-n-drop">
, dragenter
sự kiện được kích hoạt cho <div id="drag-n-drop">
phần tử và sau đó dragleave
sự kiện được kích hoạt cho <div id="dropzone">
phần tử đó.
Nếu tôi di chuột qua <div id="dropzone">
phần tử một lần nữa, dragenter
sự kiện lại được kích hoạt, điều này thật tuyệt, nhưng sau đó dragleave
sự kiện được kích hoạt cho phần tử con chỉ còn lại, do đó, removeClass
lệnh được thực thi, điều đó không hay.
Hành vi này có vấn đề vì 2 lý do:
Tôi chỉ gắn
dragenter
&dragleave
đến<div id="dropzone">
vì vậy tôi không hiểu tại sao các yếu tố trẻ em có những sự kiện gắn liền là tốt.Tôi vẫn đang kéo
<div id="dropzone">
phần tử trong khi di chuột qua các con của nó vì vậy tôi không muốndragleave
bắn!
jsFiddle
Đây là một jsFiddle để tinker với: http://jsfiddle.net/yYF3S/2/
Câu hỏi
Vậy ... làm thế nào tôi có thể làm cho nó sao cho khi tôi kéo tập tin qua <div id="dropzone">
phần tử, dragleave
không kích hoạt ngay cả khi tôi kéo qua bất kỳ phần tử con nào ... nó chỉ nên kích hoạt khi tôi rời <div id="dropzone">
phần tử .. . lơ lửng / kéo xung quanh bất cứ nơi nào trong ranh giới của phần tử sẽ không kích hoạt dragleave
sự kiện.
Tôi cần điều này để tương thích với nhiều trình duyệt, ít nhất là trong các trình duyệt hỗ trợ kéo thả HTML5, vì vậy câu trả lời này không đầy đủ.
Có vẻ như Google và Dropbox đã tìm ra điều này, nhưng mã nguồn của họ bị thu nhỏ / phức tạp nên tôi không thể tìm ra điều này từ việc triển khai của họ.
e.stopPropagation();