在 IE 中为 SaveAs 对话框进行特征/对象检测的可靠 Javascript 方法
Posted
技术标签:
【中文标题】在 IE 中为 SaveAs 对话框进行特征/对象检测的可靠 Javascript 方法【英文标题】:Reliable Javascript way to do feature/object detection for SaveAs dialog in IE 【发布时间】:2014-04-19 14:27:25 【问题描述】:我正在寻找一种跨浏览器的解决方案,以在 javascript 中显示“另存为”对话框。我在之前的项目中一直在使用这种方法,但是在 IE 11 中它被破坏了(因为 window.ActiveXObject 已经改变并且 IE 11 现在滑入下面的第一个条件):
function saveFile(fileURL, fileName)
if (!window.ActiveXObject)
// Non-IE
var save = document.createElement('a');
save.href = fileURL;
save.target = '_blank';
save.download = fileName || fileURL;
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0,
false, false, false, false, 0, null);
save.dispatchEvent(evt);
(window.URL || window.webkitURL).revokeObjectURL(save.href);
else if (document.execCommand)
// IE
var _window = window.open(fileURL, "_blank");
_window.document.close();
_window.document.execCommand('SaveAs', true, fileName || fileURL)
_window.close();
我的理解是 IE 团队故意这样做是为了防止使用这种方法进行浏览器检测。我可以使用其他类型的特征/对象检测使其再次工作吗?或者我可以(最好)删除条件,只为所有浏览器提供一段代码。当第一个条件在 IE 中运行时,我看到的错误是:
DOM7001:参数“url”无效。无法撤消 Blob URL:“[url...]”。 文件:本地主机:8080
我知道浏览器检测是一种选择(例如 WhichBrowser),但即使是作者也警告说特征/对象检测确实是可行的方法。
【问题讨论】:
如果操作正确并传递正确的标题,哪个浏览器不支持“另存为”对话框? 当我在 HTTP 响应中使用 Content-Disposition 标头时,没有一个浏览器会触发另存为对话框,这是我让它工作的唯一方法。您是说所有浏览器都尊重具有“附件;文件名=”值的 Content-Disposition 标头。你认为这是我的问题吗? 通常标题应该触发下载对话框。 我知道,但这对我不起作用。不过,这是一个 ajax 请求,这可能是问题所在。我的意思是,为了使它起作用,用户是否必须实际单击表单按钮或其他东西。如果是ajax请求,触发ajax回调时浏览器会触发另存为对话框吗? (前提是正确设置了 content-disposition 标头) 它根本不适用于 ajax 请求,因为没有加载标头。对应该触发下载对话框的文件执行 ajax 请求是没有意义的。 【参考方案1】:我认为在 html 正文中嵌入隐藏的 iFrame 并让 JS 将 iFrame 的 src 设置为 URL 可能是一个更好的解决方案。设置 src 后,如果 src URL 想要它,它将立即触发另存为对话框,例如
<body>
...
...
<iframe style="display:none" id="hidden-iframe"></iframe>
</body>
还有……
document.getElementById("hidden-iframe").src = myURL;
似乎在我迄今为止检查过的所有浏览器中都能正常工作,包括 IE(喘不过气来!)。
【讨论】:
如果浏览器可以显示myURL
,这可能不会产生另存为对话框。 Demo
我知道,但我会控制要下载的文件【参考方案2】:
只是我的 2 美分,但您发布的问题实际上是如何测试链接下载支持。由于您实际上并未使用 ActiveX,因此不应使用它来检测该功能。它离针对用户代理的测试不远了。
而是验证锚的下载属性不是字符串类型(它不会在三叉戟浏览器中)。然后执行你的IE“另存为”代码。
我目前遇到的问题只是唤起 document.execCommand('SaveAs') 100% 的时间使 IE 11 崩溃。
【讨论】:
【参考方案3】:如果您在 IE 中寻找类似的内容,可能想尝试使用 msSaveBlob
。
【讨论】:
以上是关于在 IE 中为 SaveAs 对话框进行特征/对象检测的可靠 Javascript 方法的主要内容,如果未能解决你的问题,请参考以下文章