【问题标题】:IE10 does not appear to like the drop event when dropping a fileIE10 在删除文件时似乎不喜欢 drop 事件
【发布时间】:2012-11-24 10:10:51
【问题描述】:

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

在将文件拖到网页上时,会触发正确的拖动事件,但是当我放下文件时,IE 只会打开它,而不是让 JS 处理它。

drop代码非常基础:

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

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

谢谢

【问题讨论】:

    标签: html internet-explorer-10


    【解决方案1】:

    您还需要监听 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,那么您需要在 drop 事件处理程序中引用 e.originalEvent 才能访问 dataTransfer.files

    【讨论】:

    • 我发现在 chrome 中,我只能使用拖放精细处理“dragover”和“drop”,但在 IE10 中我还需要处理“dragenter”并防止默认,否则我的“ dragover" 事件从未触发...
    • 另外:如果您在尝试自己的代码时没有看到 files 属性,但它适用于 Elijah 的代码,那么您可能是在 local(Intranet ) 网络服务器。 IE10 的脑死默认是在 (in)Compatibility View 中提供 Intranet 内容,这会禁用 dataTransfer 对象上的 files 属性等功能。在扳手菜单上,转到“兼容性视图设置”并取消选中“在兼容性视图中显示 Intranet 站点”框。 Eejits。
    • 如果您不控制 IE 配置,您可以在 HTML 中或通过自定义 HTTP 标头进行控制。在 HTML 中,你可以把它放在headvery top&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;(假设某些版本会忽略它,如果它在title 之外的任何东西之后。他们当然会。因为那是完全没有损坏。在 IE11 中对我有用;没有方便的 IE10 测试框,但为了安全起见,我会将其放在顶部。)或者,当然,配置您的服务器以在HTTP。
    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多