如何在Javascript dragenter事件期间判断拖动的内容是文本还是文件

如何在Javascript dragenter事件期间判断拖动的内容是文本还是文件,javascript,file-upload,drag-and-drop,dom-events,Javascript,File Upload,Drag And Drop,Dom Events,使用dragenter事件,我在网页上显示了一个dropzone,以便快速上传已删除的文件,而且效果良好。但是,拖动选定文本时也会弹出dropzone。如何在早期区分差异 我知道drop事件公开了所有要使用dataTransfer.files进行迭代的文件内容,但那太晚了。我需要它在dragenter,只有我看到文件数组在任何时候都是空的 我需要完全控制look&feel,我不是在寻找现有的lib 当拖动文本与文件时,我可以看到事件.dataTransfer.Clipboard.effectAl

使用dragenter事件,我在网页上显示了一个dropzone,以便快速上传已删除的文件,而且效果良好。但是,拖动选定文本时也会弹出dropzone。如何在早期区分差异

  • 我知道drop事件公开了所有要使用dataTransfer.files进行迭代的文件内容,但那太晚了。我需要它在dragenter,只有我看到文件数组在任何时候都是空的

  • 我需要完全控制look&feel,我不是在寻找现有的lib

  • 当拖动文本与文件时,我可以看到事件.dataTransfer.Clipboard.effectAllowed的不同值,但每个浏览器的值也不同(Chrome与FF)

  • 如果有帮助的话,MooTools已经就位


  • 好吧,我已经取得了足够的进步,在Chrome和Firefox(3.6+)上取得了显著的进步。这可能不是万无一失的,但如果有人觉得它有用,下面是代码:

      var isFileTransfer = false;
      if (evt.dataTransfer.types) {
        for (var i=0; i<evt.dataTransfer.types.length; i++) {
          if (evt.dataTransfer.types[i] == "Files") {
            isFileTransfer = true;
            break;
          }
        }
      }
    
    var isFileTransfer=false;
    if(evt.dataTransfer.types){
    
    对于(var i=0;i我编写了一个小函数来检测文件的拖动

    function isFileTransfer(evt){
        return [].some.call(evt.dataTransfer.types,function(t){return t=="Files";});
    }
    

    我需要确定文件是从外部拖到浏览器中,还是从浏览器窗口内拖到图像中。我通过在文档对象上侦听dragstart来确定。当文件从外部拖到浏览器中时,dragstart不会启动。因此,如果如果启动,则表示同一页面中的某些内容正在被拖动

    document.addEventListener('dragstart', function() {
        samePageDrag = true;
    }, false);
    
    document.addEventListener('dragend', function() {
        if (samePageDrag) {
            samePageDrag = false;
        }
    }, false);
    

    使用此选项,您可以在dragenterdragover事件后检查samePageDrag的值,以确定所拖动的内容是否来自浏览器外部。

    如果OP返回,请将此标记为答案。这对我很有效!我发现需要为“drop”事件添加另一个侦听器正确清除'samePageDrag'变量,但这正是我所需要的。