在 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 方法的主要内容,如果未能解决你的问题,请参考以下文章

jCrop API 在 IE 中为 null 或不是对象,但适用于 FF、Chrome 等

在 SaveAs 对话框前面显示弹出消息

如何设置Android Studio背景的颜色

如何更改Android Studio的代码字体和颜色

如何更改Android Studio的代码字体和颜色

对象'_Workbook'的方法'SaveAs'失败VBA