【问题标题】:Drag and Drop Image upload not working on certain browsers拖放图像上传在某些浏览器上不起作用
【发布时间】:2017-03-03 15:05:09
【问题描述】:

我正在为我们的网站添加一项功能,该功能允许用户通过将图像从桌面拖放到浏览器中来上传图像。我使用一个 div 创建了一个“放置区”,给它一个宽度和高度,并向它添加了拖动和放置事件侦听器。它在 Chrome 和 Edge 中运行良好,但在 Firefox、IE 或 Opera 中无法运行。对于这三个浏览器,一旦我尝试将图像拖动到浏览器中,光标就会变成一个带有斜线的圆圈,表示拖动操作将被取消。我知道我必须阻止浏览器默认设置,因为 Chrome 的默认设置是复制图像地址并将其显示在新窗口中。我能够使其适用于 Chrome,但由于某种原因,我必须防止默认设置的代码不适用于其他 3 种浏览器。

代码如下:

HTML:

<!DOCTYPE html>
<html lang="en-us">
<head>
    <meta charset="utf-8" />
    <title>Image Uploader</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link href="css/StyleSheet.css" rel="stylesheet" />
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js" defer></script>
    <script src="script/JavaScript.js" defer></script>
</head>
<body>
   <input type="file" id="file" name="files[]" multiple onchange="startRead()"/>
   <div id="draghere">Drop Your files here <span id="mouseposition"></span></div>
   <div id="op"></div>
</body>
</html>

CSS:

#draghere {
    width: 50%;
    height: 150px;
    border: 1px solid lightgray;
    font-size: 3em;
    text-align: center;
    padding-top: 50px;
}

JavaScript(使用 JQuery):

window.addEventListener("dragover", function (e) {
    e = e || event;
    e.preventDefault();
}, false);
window.addEventListener("drop", function (e) {
    e = e || event;
    e.preventDefault();
}, false);

// Fired when uploading an image using the input button
function startRead(evt) {
    var file = document.getElementById("file").files[0];
    if (file) {
        if (file.type.match("image.*")) {
            getAsImage(file);
            alert("Name: " + file.name);
        }
    }

    evt.stopPropagation();
    evt.preventDefault();
}

// Fired when uploading an image using drag and drop
function startReadFromDrag(evt) {
    var file = evt.dataTransfer.files[0];
    if (file) {
        if (file.type.match("image.*")) {
            getAsImage(file);
            $("#draghere").css("background-color", "");
        }
    }

    evt.stopPropagation();
    evt.preventDefault();
}

function docolorchange(evt) {
    $("#draghere").css("background-color", "yellow");
}

function getAsImage(readFile) {
    var reader = new FileReader();
    reader.readAsDataURL(readFile);
    reader.onload = addImg;
}

function addImg(imgsrc) {
    // Display image
    $("#op").prepend("<img src='" + imgsrc.target.result + "'/>");

    // upload to server
}

// Add event Listeners to drop zone
var droppingDiv = document.getElementById("draghere");
droppingDiv.addEventListener("dragover", docolorchange, false);
droppingDiv.addEventListener("drop", startReadFromDrag, false);

我是否缺少一些可以让我在 Firefox、IE 和 Opera 中进行拖放的东西?根据我所阅读的有关拖放 API 的内容,它应该适用于所有浏览器,但这不是我一直拥有的体验。

提前致谢!

更新:让这件事变得非常奇怪的是,在我编写这段代码的那天,我在我提到的所有 5 种浏览器中都对其进行了测试,并且它在所有这些浏览器中都有效。第二天,它在 IE、Edge 和 Opera 中停止工作。我没有更改任何一行代码!这让我觉得这是缓存的问题,所以我在每个浏览器上都清除了它,但仍然没有......

【问题讨论】:

    标签: javascript jquery html css drag-and-drop


    【解决方案1】:

    我刚刚在 Chrome、Firefox 和 Opera (Mac OS) 中进行了尝试,并且在所有 3 中都可以使用。

    无论如何,输入文件 HTML 标记正在使用拖放操作。因此,无需创建 div 并使用 JavaScript 来处理所有事件,您只需设置输入样式以直接从输入创建一个拖放框。然后拖放应该适用于所有浏览器。

    【讨论】:

    • 嗯,看到您的回复后,我尝试在那些浏览器中运行而不使用 Visual Studio 调试器(就像我在之前的测试中所做的那样),它成功了!这一定是 Visual Studio 调试器或它使用的 IIS Express 服务器的问题。谢谢!
    猜你喜欢
    • 2016-10-28
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多