2012-12-06 2 views
9

У меня есть простое веб-приложение, которое использует filerader api в HTML5 для принятия загрузки файлов с помощью перетаскивания.IE10 не похоже на событие drop при отбрасывании файла

При перетаскивании файла на веб-страницу будет происходить правильное событие перетаскивания, но когда я удаляю файл, IE просто открывает его, а не позволяет JS обрабатывать его.

Код капли очень проста:

this.addEventListener("drop", function(event) { 
event.stopPropagation(); 
event.preventDefault(); 
Self.drop(event); //this event is not hit. IE just opens the file! 
}, false); 

Это конкретное ограничение IE10 или я мог бы сделать что-то не так?

Благодаря

ответ

23

Вы хотите также слушать dragenter и dragover событий и предотвратить их поведение по умолчанию. Вы также хотите предотвратить поведение по умолчанию в обработчике событий drop.

Например, вы можете захотеть сделать что-то вроде этого ...

var $dropArea = $("#drop-area"); 

$dropArea.on({ 
    "drop" : makeDrop, 
    "dragenter": ignoreDrag, 
    "dragover": ignoreDrag 
}); 

function ignoreDrag(e) { 
    e.preventDefault(); 
} 

function makeDrop(e) { 
    var fileList = e.originalEvent.dataTransfer.files, 
     fileReader; 

    e.preventDefault(); 
    if (fileList && fileList.length > 0) { 
     fileReader = new FileReader(); 
     fileReader.onloadend = handleReaderOnLoadEnd($("<img />")); 
     fileReader.readAsDataURL(fileList[ 0 ]); 
    } 
} 

function handleReaderOnLoadEnd($image) { 
    return function(event) { 
     $image.attr("src", this.result) 
      .addClass("small") 
      .appendTo("#drop-area"); 
    }; 
} 

Вы можете найти рабочий пример в этом JSFiddle http://jsfiddle.net/qsyNW/

Примечание: Вы не должны использовать JQuery с этим как я. Однако, если вы используете jQuery, тогда вам нужно будет указать e.originalEvent внутри обработчика события drop, чтобы попасть на dataTransfer.files.

+11

Я обнаружил, что в chrome я мог бы использовать перетаскивание с точной обработкой только «dragover» и «drop», но в IE10 мне также нужно было обрабатывать «dragenter» и предотвращать дефолт, иначе мое событие «dragover» никогда не запускалось ... – markt

+3

Дополнительно: Если вы не видите свойства 'files' при попытке вашего собственного кода, но оно работает с Elijah's, вы, вероятно, запускаете тест на своем ** локальном ** (intranet) веб-сервере. По умолчанию IE10 отключает мозг, чтобы обслуживать содержимое интрасети в представлении совместимости (в), что отключает такие функции, как свойство 'files' объекта' dataTransfer'. В меню гаечного ключа перейдите в раздел «Параметры просмотра совместимости» и снимите флажок «Показывать сайты интрасети в окне совместимости». Eejits. –

+1

Если вы не контролируете конфигурацию IE, вы можете сделать это в своем HTML или через пользовательские заголовки HTTP. В HTML вы можете поместить это в ** очень верхнюю часть 'head':' '(Предположительно, некоторые версии будут игнорировать это если ничего, кроме 'title'. Конечно, они будут, потому что это не сломано. Дальше работает для меня в IE11, нет удобного тестового окна IE10, но я бы поставил его наверху безопасность). Или, конечно же, настройте сервер для отправки этого заголовка в HTTP. –