我们的用户需要将文件从政府网站传输到我们内部的基于Web的应用程序中。他们每天需要移动数十个文件,直到现在,他们一直在单击政府网站上的每个文件链接,将文件保存到本地的“下载”文件夹中,然后从那里将其上传到我们的Web应用程序。
为简化流程,我编写了代码,允许他们将文件链接直接从政府网站拖到Web应用程序上的拖放区。我从JS中放置区域的放置事件中获取文件的URL,然后在.NET的WebClient.DownloadFile()方法中使用该URL将文件拖入我们的Web应用程序。
即使将链接从一个浏览器窗口(政府网站)拖动到另一个浏览器窗口(我们的内部Web应用程序),此代码在Edge中也能很好地工作。 Chrome和Firefox也一样。 IE11,但是,不起作用。这是一个问题,因为许多用户需要使用IE11才能向后兼容我们仍在大量使用的旧版SharePoint。
当文件的链接被放在放置区域时,IE11不会获取文件URL。而是,IE11会将链接删除视为您单击文件链接一样。换句话说,它尝试在本地下载文件。 SO上有一个number of posts通常可以解决此问题,some seem to indicate指出,即使对于IE11,正确的选项组合也应该有效,但是在任何情况下我都无法让IE11进行合作
下面是一些示例代码,演示了该行为(以及用于测试该行为的JS Bin):
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Drag/Drop Test</title>
<style>
#dropArea {
width: 300px;
height: 200px;
margin-bottom: 40px;
border: 1px dashed;
}
</style>
</head>
<body>
<div id="dropArea">Drop dragged links here</div>
<a href="https://stackoverflow.com">This is a test link to Stack Overflow</a>
<script type="text/javascript">
var dropArea = document.getElementById('dropArea');
dropArea.addEventListener('dragenter', function (evt) { evt.stopPropagation(); evt.preventDefault(); }, false);
dropArea.addEventListener('dragexit', function (evt) { evt.stopPropagation(); evt.preventDefault(); }, false);
dropArea.addEventListener('dragleave', function (evt) { evt.stopPropagation(); evt.preventDefault(); }, false);
dropArea.addEventListener('dragover', function (evt) { evt.stopPropagation(); evt.preventDefault(); }, false);
dropArea.addEventListener('drop', dropHandler, false);
function dropHandler(evt) {
evt.stopPropagation();
evt.preventDefault();
var droppedObjectURL = evt.dataTransfer.getData('Text');
alert("droppedObjectURL=" + droppedObjectURL);
}
</script>
</body>
</html>
要进行测试,请在一个Chrome / FF / Edge窗口中打开JS Bin,然后打开第二个Chrome / FF / Edge窗口至包含可下载文件的任何页面(请确保对两个浏览器使用相同的浏览器样式视窗)。将文件链接从一个窗口拖动到另一个窗口的放置区域。在Chrome / FF / Edge中,它应该显示带有文件链接URL的弹出警报。但是,在IE11中,它会在尝试下载文件时询问您是否要打开或保存文件。
以前解决这个IE11问题的大多数SO帖子都有很多年了,所以我希望新的东西浮出水面,从而可以在IE11中使用。如果本机无能为力,我也欢迎第三方解决方案。