ภาพรวม
ฉันมีโครงสร้าง HTML ต่อไปนี้และฉันได้แนบdragenterและdragleaveกิจกรรมกับ<div id="dropzone">องค์ประกอบ
<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>
ปัญหา
เมื่อฉันลากไฟล์ไป<div id="dropzone">บนdragenterเหตุการณ์จะเริ่มทำงานตามที่คาดไว้ แต่เมื่อฉันเลื่อนเมาส์ของฉันมากกว่าองค์ประกอบลูกเช่น<div id="drag-n-drop">การdragenterจัดกิจกรรมที่เป็นเชื้อเพลิงสำหรับ<div id="drag-n-drop">องค์ประกอบแล้วdragleaveเหตุการณ์ถูกยิงสำหรับ<div id="dropzone">องค์ประกอบ
หากฉันเลื่อนเมาส์ไปที่<div id="dropzone">องค์ประกอบอีกครั้งdragenterเหตุการณ์จะถูกยิงอีกครั้งซึ่งเยี่ยมยอด แต่จากนั้นdragleaveเหตุการณ์จะถูกไล่ออกสำหรับองค์ประกอบลูกเพิ่งออกไปดังนั้นremoveClassคำสั่งจะถูกดำเนินการซึ่งไม่เย็น
พฤติกรรมนี้เป็นปัญหาด้วยเหตุผล 2 ประการ:
ฉันก็แค่ติด
dragenterและdragleaveไป<div id="dropzone">ดังนั้นผมจึงไม่เข้าใจว่าทำไมองค์ประกอบเด็กมีเหตุการณ์เหล่านี้ที่แนบมาด้วยเช่นกันฉันยังคงลาก
<div id="dropzone">องค์ประกอบขณะโฉบเหนือลูกของมันดังนั้นฉันไม่ต้องการdragleaveยิง!
jsFiddle
นี่คือ jsFiddle เพื่อคนจรจัดด้วย: http://jsfiddle.net/yYF3S/2/
คำถาม
ดังนั้น ... ฉันจะทำให้มันเป็นแบบนั้นได้อย่างไรเมื่อฉันลากไฟล์ไปไว้บน<div id="dropzone">องค์ประกอบdragleaveอย่ายิงแม้ว่าฉันจะลากองค์ประกอบใด ๆ ของเด็ก ... มันควรจะทำงานเมื่อฉันออกจาก<div id="dropzone">องค์ประกอบ .. . การวางเมาส์ / ลากไปรอบ ๆ บริเวณใด ๆ ภายในขอบเขตขององค์ประกอบไม่ควรทำให้เกิดdragleaveเหตุการณ์
ฉันต้องการสิ่งนี้เพื่อให้สามารถทำงานร่วมกับเบราว์เซอร์ข้ามเบราว์เซอร์ที่รองรับ HTML5 drag-n-drop ได้อย่างน้อยดังนั้นคำตอบนี้นี้ไม่เพียงพอ
ดูเหมือนว่า Google และ Dropbox ได้คิดสิ่งนี้ออกมา แต่ซอร์สโค้ดของพวกมันนั้นเล็ก / ซับซ้อนดังนั้นฉันจึงไม่สามารถที่จะเข้าใจสิ่งนี้จากการใช้งานของพวกเขา
e.stopPropagation();