Internetexplorer-可靠的Javascript方法,用于在IE中对SaveAs对话框进行功能/对象检测

internet explorer - Reliable Javascript way to do feature/object detection for SaveAs dialog in IE

本文关键字:对话框 SaveAs 功能 检测 对象 中对 IE Javascript 方法 用于 Internetexplorer-      更新时间:2023-09-26

我正在寻找一个跨浏览器的解决方案来显示Javascript中的"另存为"对话框。我在以前的一个项目中一直使用这种方法,但它在IE 11中被破坏了(因为窗口.ActiveObject已经更改,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…]"。
文件:localhost:8080

我知道浏览器检测是一种选择(例如,像WhichBrowser),但即使是它的作者也警告说,功能/对象检测确实是一种方法。

我认为在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(惊叹!)。

只有我的2美分,但您发布的问题实际上是如何测试链接下载支持。由于您实际上并没有使用ActiveX,因此不应该使用它来检测该功能。它离针对用户代理进行测试不远了。

相反,请验证锚点的下载属性不是字符串类型(在三叉戟浏览器中不会是字符串类型)。然后执行你的IE"另存为"代码。

我目前遇到的问题只是唤起文档。execCommand("SaveAs")100%的时间都在崩溃IE 11。

如果您正在IE中查找类似的内容,则可能需要尝试使用msSaveBlob