O evento de descarte não dispara no cromo


92

Parece que o evento drop não está sendo acionado quando eu esperava.

Presumo que o evento de soltar é acionado quando um elemento que está sendo arrastado é liberado acima do elemento de destino, mas não parece ser o caso.

O que estou entendendo mal?

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


Respostas:


195

Para que o evento drop ocorra em um elemento div, você deve cancelar os eventos ondragentere ondragover. Usando jquery e seu código fornecido ...

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

Para obter mais informações, verifique a página MDN .


11
Você não precisa de ondragenter, apenas ondragover.
access_granted

1
Ainda um no-go, pelo menos ao arrastar imagens para o Chrome mais recente.
NoBugs de

2
Ainda não funciona no Chromium mais recente (Vivaldi 1.2.490.39 () (32 bits) jsfiddle.net/f282n3pt/3
mcsdwarken

2
Com reactjs, você precisa adicionar o manipulador onDragOver ao mesmo elem.
CHAN

5
A API html5 dnd é tão ruim assim?
bartosz.baczek

46

Você pode se safar apenas fazendo um comentário event.preventDefault()sobre o dragoverevento. Isso irá disparar o dropevento.


1
que tem um caso de borda não coberto, você deve chamar e.preventDefault () no dragenter também, veja meu outro comentário
zupa

4

Para que o evento drop seja disparado, você precisa atribuir um dropEffect durante o evento over, caso contrário, o evento ondrop nunca será disparado:

$('.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
Na verdade, você precisa fazer event.originalEvent.dataTransfer.dropEffect = "copy"porque jQuery usa seu próprioevent
AymKdn

0

Esta não é uma resposta real, mas para algumas pessoas como eu, que não têm disciplina para consistência. A gota não disparou para mim em cromo quando effectAllowedo efeito que eu não tinha planejado não era o mesmo dropEffect. No entanto, funcionou para mim no Safari. Isso deve ser definido como abaixo:

ev.dataTransfer.effectAllowed = 'move';

Alternativamente, effectAllowedpode ser definido comoall , mas prefiro manter a especificidade onde puder.

para um caso em que o efeito de queda é movido:

ev.dataTransfer.dropEffect = 'move';

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.