Tổng quat
Tôi có cấu trúc HTML sau đây và tôi đã đính kèm dragentervà dragleavecá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">, dragentersự 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">, dragentersự kiện được kích hoạt cho <div id="drag-n-drop">phần tử và sau đó dragleavesự 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, dragentersự kiện lại được kích hoạt, điều này thật tuyệt, nhưng sau đó dragleavesự kiện được kích hoạt cho phần tử con chỉ còn lại, do đó, removeClasslệ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ốndragleavebắ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ử, dragleavekhô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 dragleavesự 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();