Estou adicionando um recurso de arrastar e soltar html5 à minha página.
Quando um arquivo é solto na área de upload, tudo funciona muito bem.
No entanto, se eu soltar acidentalmente o arquivo fora da área de upload, o navegador carregará o arquivo local como se fosse uma nova página.
Como posso evitar esse comportamento?
Obrigado!
javascript
jquery
html
drag-and-drop
Travis
fonte
fonte
Respostas:
Você pode adicionar um ouvinte de eventos à janela que chama
preventDefault()
todos os eventos de arrastar e soltar.Exemplo:
fonte
dragover
edrop
manipuladores são necessários para impedir que o navegador carregue o arquivo descartado. (Chrome mais recente em 2015/08/03). A solução também funciona no FF mais recente.<input type="file" />
. É necessário verificar see.target
é uma entrada de arquivo e deixar esses eventos passarem.Depois de muita discussão, achei a solução mais estável:
Definir ambos
effectAllow
edropEffect
incondicionalmente na janela faz com que minha zona de recebimento não aceite mais nenhum dnd, independentemente de as propriedades serem definidas como novas ou não.fonte
Para jQuery, a resposta correta será:
Aqui
return false
se comportará comoevent.preventDefault()
eevent.stopPropagation()
.fonte
Para permitir arrastar e soltar apenas em alguns elementos, você pode fazer algo como:
fonte
tente isto:
fonte
Impedir todas as operações de arrastar e soltar por padrão pode não ser o que você deseja. É possível verificar se a fonte de arrastar é um arquivo externo, pelo menos em alguns navegadores. Incluí uma função para verificar se a fonte de arrasto é um arquivo externo nesta resposta do StackOverflow .
Modificando a resposta do Digital Plane, você pode fazer algo assim:
fonte
e || event;
? Onde éevent
definido? Deixa pra lá. Parece que é um objeto global no IE? Encontrei esta citação,"In Microsoft Visual Basic Scripting Edition (VBScript), you must access the event object through the window object."
aquiNa minha experiência, esse problema surge quando você adiciona a funcionalidade de queda de arquivo a uma página. Portanto, minha opinião é que o componente que adiciona isso também deve ser responsável por impedir a queda fora da zona de queda.
Na minha solução, a zona de recebimento é uma entrada com uma classe, mas qualquer seletor inequívoco funciona.
Os ouvintes são adicionados / removidos automaticamente quando o componente é criado / destruído, e outros componentes que usam a mesma estratégia na mesma página não interferem entre si devido ao stopPropagation ().
fonte
Para desenvolver o método "verifique o destino" descrito em algumas outras respostas, aqui está um método mais genérico / funcional:
Chamado como:
fonte
function preventDefaultExcept(...predicates){}
. E então use-o comopreventDefaultExcept(isDropzone, isntParagraph)
Eu tenho um HTML
object
(embed
) que preenche a largura e a altura da página. A resposta do @ digital-plane funciona em páginas da Web normais, mas não se o usuário cair em um objeto incorporado. Então, eu precisava de uma solução diferente.Se passarmos a usar a fase de captura de eventos , podemos obter os eventos antes que o objeto incorporado os receba (observe o
true
valor no final da chamada do ouvinte de evento):Usando o código a seguir (com base na resposta do @ digital-plane), a página se torna um alvo de arrastar, impede que as incorporações de objetos capturem os eventos e, em seguida, carrega nossas imagens:
Testado no Firefox no Mac.
fonte
Como estou usando um seletor de classe para várias áreas de upload, minha solução assumiu essa forma menos pura
Baseado na resposta de Axel Amthor, com dependência do jQuery (com alias de $)
fonte