ภาพรวม
ฉันมีโครงสร้าง 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();