删除文件时,IE10似乎不喜欢drop事件

Ser*_*gio 9 html5 internet-explorer-10

我有一个简单的Web应用程序,它使用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);
Run Code Online (Sandbox Code Playgroud)

这是IE10的特定限制还是我可能做错了什么?

谢谢

Eli*_*nor 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" );
    };
}
Run Code Online (Sandbox Code Playgroud)

你可以在这个JSFiddle http://jsfiddle.net/qsyNW/找到一个有用的例子

注意:您不必像我一样使用jQuery.但是,如果你确实使用了jQuery,那么你需要e.originalEventdrop事件处理程序中引用才能获得dataTransfer.files.

  • 我发现在chrome中,我可以使用拖放精细处理"dragover"和"drop",但在IE10中我需要处理"dragenter"并防止默认,否则我的"dragover"事件从未被解雇... (11认同)
  • 另外:如果您在尝试使用自己的代码时没有看到`files`属性,但它可以与Elijah一起使用,那么您可能正在**本地**(Intranet)网络服务器上运行测试.IE10的脑死亡默认是在(in)兼容性视图中提供内部网内容,这会禁用`dataTransfer`对象上的`files`属性等功能.在扳手菜单上,转到"兼容性视图设置",然后取消选中"在兼容性视图中显示Intranet站点"框.Eejits. (3认同)