เหตุการณ์ดร็อปไม่เริ่มทำงานใน Chrome


93

ดูเหมือนว่าเหตุการณ์ดร็อปจะไม่เกิดขึ้นเมื่อฉันคาดหวัง

ฉันคิดว่าเหตุการณ์ดร็อปเริ่มทำงานเมื่อองค์ประกอบที่ถูกลากถูกปล่อยออกมาเหนือองค์ประกอบเป้าหมาย แต่ดูเหมือนจะไม่เป็นเช่นนั้น

ฉันเข้าใจผิดอะไร?

http://jsfiddle.net/LntTL/

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(){
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})

คำถามที่ซ้ำกัน: stackoverflow.com/questions/19223352/jquery-ondrop-not-firing/…
bob

คำตอบที่เป็นไปได้: stackoverflow.com/questions/8414154/…
bob

คำตอบ:


201

เพื่อให้เหตุการณ์ดร็อปเกิดขึ้นในองค์ประกอบ div คุณต้องยกเลิกondragenterและondragoverเหตุการณ์ ใช้ jquery และรหัสของคุณที่ให้มา ...

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(event){
    event.preventDefault();
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})
$('.drop').on('dragover',function(event){
    event.preventDefault();
})

สำหรับข้อมูลเพิ่มเติมโปรดดูที่หน้า MDN


11
คุณไม่จำเป็นต้องใช้ ondragenter มีเพียง ondragover
access_granted

1
ยังคงไม่ต้องไปอย่างน้อยที่สุดเมื่อลากภาพไปที่ Chrome รุ่นล่าสุด
NoBugs

2
ยังใช้ไม่ได้กับ Chromium ล่าสุด (Vivaldi 1.2.490.39 () (32 บิต) jsfiddle.net/f282n3pt/3
mcsdwarken

2
ด้วย reactjs คุณต้องเพิ่มตัวจัดการ onDragOver ให้กับองค์ประกอบเดียวกัน
CHAN

5
html5 dnd API นั้นแย่จริงหรือ
bartosz.baczek

47

คุณสามารถไปได้ด้วยการทำไฟล์ event.preventDefault()ในdragoverเหตุการณ์ การทำเช่นนี้จะทำให้dropเหตุการณ์เกิดขึ้น


2
ที่มีกรณีขอบที่ไม่ได้รับการเปิดเผยคุณต้องเรียกใช้ e.preventDefault () บน dragenter ด้วยดูความคิดเห็นอื่น ๆ ของฉัน
zupa

5

เพื่อให้เหตุการณ์ดร็อปเริ่มทำงานคุณต้องกำหนด dropEffect ในช่วงโอเวอร์เหตุการณ์มิฉะนั้นเหตุการณ์ ondrop จะไม่ถูกทริกเกอร์:

$('.drop').on('dragover',function(event){
    event.preventDefault();
    event.dataTransfer.dropEffect = 'copy';  // required to enable drop on DIV
})
// Value for dropEffect can be one of: move, copy, link or none
// The mouse icon + behavior will change accordingly.

8
จริงๆแล้วคุณต้องทำevent.originalEvent.dataTransfer.dropEffect = "copy"เพราะ jQuery ใช้ของตัวเองevent
AymKdn

1

นี่ไม่ใช่คำตอบที่แท้จริง แต่สำหรับบางคนเช่นฉันที่ขาดวินัยในความสม่ำเสมอ Drop ไม่ใช้แฟลชสำหรับฉันในโครเมี่ยมเมื่อที่ไม่ได้ผลที่ผมได้กำหนดไว้สำหรับeffectAllowed dropEffectอย่างไรก็ตามมันได้ผลสำหรับฉันใน Safari ควรตั้งค่าดังนี้:

ev.dataTransfer.effectAllowed = 'move';

อีกวิธีหนึ่งeffectAllowedสามารถตั้งค่าเป็นallแต่ฉันต้องการรักษาความเฉพาะเจาะจงที่ฉันสามารถทำได้

สำหรับกรณีที่มีการย้ายเอฟเฟกต์ดรอป:

ev.dataTransfer.dropEffect = 'move';

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.