9

我有一个简单的网络应用程序,它使用 HTML5 中的 filereader api 通过拖放接受文件上传。

将文件拖到网页上时,会触发正确的拖动事件,但是当我放下文件时,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 的特定限制还是我做错了什么?

谢谢

4

1 回答 1

24

您还需要监听dragenterdragover事件并防止它们的默认行为。您还需要防止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.

于 2013-03-02T05:15:41.800 回答