Sự kiện thả không kích hoạt trong chrome


92

Có vẻ như sự kiện giảm không kích hoạt khi tôi mong đợi.

Tôi giả sử rằng sự kiện thả sẽ kích hoạt khi một phần tử đang được kéo được giải phóng phía trên phần tử đích, nhưng điều này dường như không đúng với trường hợp này.

Tôi đang hiểu sai điều gì?

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');
})


câu trả lời tiềm năng: stackoverflow.com/questions/8414154/…
bob

Câu trả lời:


195

Để sự kiện drop xảy ra trên phần tử div, bạn phải hủy sự kiện ondragenterand ondragover. Sử dụng jquery và mã của bạn được cung cấp ...

$('.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();
})

Để biết thêm thông tin, hãy xem trang MDN .


11
Bạn không cần ondragenter, chỉ ondragover.
access_granted

1
Vẫn là một điều không nên, ít nhất là khi kéo hình ảnh lên đó trên Chrome mới nhất.
NoBugs

2
Vẫn không hoạt động trên Chromium mới nhất (Vivaldi 1.2.490.39 () (32-bit) jsfiddle.net/f282n3pt/3
mcsdwarken

2
Với reactjs, bạn cần thêm trình xử lý onDragOver vào cùng một elem.
CHAN

5
API dnd html5 có thực sự tệ không?
bartosz.baczek

46

Bạn có thể nhận được ngay với chỉ làm một event.preventDefault()trên dragoversự kiện. Làm điều này sẽ kích hoạt dropsự kiện.


1
rằng có một trường hợp cạnh phát hiện, bạn phải gọi e.preventDefault () trên DragEnter quá, xem bình luận khác của tôi
Zupa

4

Để sự kiện rơi kích hoạt, bạn cần phải chỉ định dropEffect trong sự kiện qua, nếu không sự kiện ondrop sẽ không bao giờ được kích hoạt:

$('.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.

7
Trên thực tế bạn cần làm event.originalEvent.dataTransfer.dropEffect = "copy"vì jQuery sử dụng riêng của mìnhevent
AymKdn

0

Đây không phải là một câu trả lời thực tế nhưng đối với một số người như tôi, những người thiếu kỷ luật về tính nhất quán. Drop không kích hoạt đối với tôi trong chrome khi đó effectAllowedkhông phải là hiệu ứng mà tôi đã thiết lập dropEffect. Tuy nhiên, nó đã hoạt động đối với tôi trong Safari. Điều này sẽ được thiết lập như sau:

ev.dataTransfer.effectAllowed = 'move';

Ngoài ra, effectAllowedcó thể được đặt là all, nhưng tôi muốn giữ tính cụ thể ở những nơi tôi có thể.

đối với trường hợp khi hiệu ứng thả được di chuyển:

ev.dataTransfer.dropEffect = 'move';

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.