Как определить, что файл перетаскивается, а не перетаскиваемый элемент на моей странице? - PullRequest
38 голосов
/ 27 июля 2011

Я использую события html5 для включения перетаскивания файлов и элементов.Я прикрепил событие dragover к телу и использую делегирование событий, чтобы показать, где можно удалить перетаскиваемый объект.Мой вопрос: как я могу определить, перетаскивается ли файл по сравнению с элементом с draggable = true.Я знаю, что могу обнаружить перетаскиваемый элемент через e.target.Но как я могу определить, является ли это файл?

jquery доступен.

Кроме того, не говорит о jquery-ui, перетаскиваемом сюда.* Я начинаю думать, что, возможно, единственный способ обнаружить файл - это исключение и обнаружение элементов.Если мы не перетаскиваем элемент, предположим, что это файл.Это потребует дополнительной работы, так как изображения и ссылки по умолчанию можно перетаскивать, поэтому мне придется добавлять к ним события или предотвращать их перетаскивание.

Ответы [ 4 ]

64 голосов
/ 13 декабря 2011

Вы можете обнаружить то, что перетаскивается, проверив dataTransfer.types.Это поведение (пока) не согласовано в разных браузерах, поэтому вам нужно проверить наличие 'Files' (Chrome) и 'application/x-moz-file' (Firefox).

// Show the dropzone when dragging files (not folders or page
// elements). The dropzone is hidden after a timer to prevent 
// flickering to occur as `dragleave` is fired constantly.
var dragTimer;
$(document).on('dragover', function(e) {
  var dt = e.originalEvent.dataTransfer;
  if (dt.types && (dt.types.indexOf ? dt.types.indexOf('Files') != -1 : dt.types.contains('Files'))) {
    $("#dropzone").show();
    window.clearTimeout(dragTimer);
  }
});
$(document).on('dragleave', function(e) {
  dragTimer = window.setTimeout(function() {
    $("#dropzone").hide();
  }, 25);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="dropzone" style="border: 2px dashed black; background: limegreen; padding: 25px; margin: 25px 0; display: none; position">
  ? Drop files here!
</div>
? hover files here
6 голосов
/ 25 июля 2013

Дальнейшее улучшение ответа букэ:

Поскольку chrome вызывает перетаскивание документа на каждом перетаскивающем элементе для каждого элемента, это может вызвать мерцание в зоне сброса, особенно если имеется много вложенных элементов.

Что я сделал, чтобы решить эту проблему, так это немного увеличить время ожидания и добавить clearTimeout перед установкой каждого времени ожидания, поскольку ранее в некоторых случаях было более одного таймаута, который не очищается в событии dragover, так как dragTimer сохраняеттолько последний.Итоговая версия:

$(document).on('dragleave', function(e) {
    window.clearTimeout(dragTimer);
    dragTimer = window.setTimeout(function() {
        $("#dropzone").hide();
    }, 85);
});

Кстати, спасибо за идею!Мое другое решение было абсолютной болью:)

4 голосов
/ 19 ноября 2015

Я просто использую это для обнаружения файлов в dragover событии:

Array.prototype.indexOf.call(files, "Files")!=-1 // true if files
0 голосов
/ 17 августа 2015

Используйте функцию ниже, чтобы проверить, является ли источник перетаскивания внешним файлом.

Протестировано в Windows 7 с:

  • Firefox версия 39
  • Chrome версия 44
  • Safari версия 5.1.7
function isDragSourceExternalFile(dataTransfer){
    // Source detection for Safari v5.1.7 on Windows.
    if (typeof Clipboard != 'undefined') {
        if (dataTransfer.constructor == Clipboard) {
            if (dataTransfer.files.length > 0)
                return true;
            else
                return false;
        }
    }

    // Source detection for Firefox on Windows.
    if (typeof DOMStringList != 'undefined'){
        var DragDataType = dataTransfer.types;
        if (DragDataType.constructor == DOMStringList){
            if (DragDataType.contains('Files'))
                return true;
            else
                return false;
        }
    }

    // Source detection for Chrome on Windows.
    if (typeof Array != 'undefined'){
        var DragDataType = dataTransfer.types;
        if (DragDataType.constructor == Array){
            if (DragDataType.indexOf('Files') != -1)
                return true;
            else
                return false;
        }
    }
}

Пример использования с JQuery

$(document).on('dragover', function(e){
    var IsFile = isDragSourceExternalFile(e.originalEvent.dataTransfer);
    console.log(IsFile);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...