9

我有一个应用程序,它使用以下代码在新选项卡中打开动态生成的报告。(为了演示,我已经模拟了参数。)

function gblPDFWdw(pdf) {
    var formDiv = document.createElement("div");
    formDiv.innerHTML = "<form method=post action='" + pdf + "' target='_blank'><input type=hidden id=test name=test value='test'></form>";
    var form = formDiv.firstChild;
    document.body.appendChild(form);
    form.submit();
    form.parentNode.removeChild(form);
}

pdf参数我们只是生成 PDF 的脚本的 URL 。操作的原因form是将参数POST编辑到脚本而不是作为GET参数。

在 IE 8 及更低版本、Chrome、Firefox 等中,这将执行以下两种操作之一:

  1. 如果浏览器可以读取 PDF(通过内置功能或插件),它将打开一个带有报告的新选项卡,这是所需的行为。
  2. 如果浏览器无法读取 PDF,它将打开新标签页,立即将其关闭,然后下载文件。

似乎#2 在 IE 9 及更高版本中发生了变化。它将打开一个新选项卡,但它只会产生一个空白屏幕,直到用户返回原始选项卡,单击“打开”或“保存”,然后按预期下载 PDF。这是一个非常混乱的界面。

我想解决这个问题的一种方法是生成一个临时 PDF 文件,然后简单地 window.open() 到它。还有其他方法可以调整此功能的行为吗?或者有没有我没有遇到过的推荐做法?

(注意:这根本不是特定于 PDF 的;浏览器可能下载而不是本地显示的任何文件似乎都有问题。)

编辑:看起来我比我意识到的更落后。看来这也发生在 IE9 中,我从来没有注意到,因为我从来没有在没有安装 PDF 插件或其他文件类型的情况下尝试过它。

有趣的是,如果我从表单中删除input字段,上面的代码就像我期望的那样工作。我不确定为什么浏览器会以不同的方式对待它。当然,就我而言,我需要将POST数据输入到我的脚本中。

编辑2:愚蠢的错误。input是自闭的。固定的。

编辑 3:这里有一些截图可以更好地解释这个问题。我正在使用这个 JSBin进行测试。我有一个 onclick 事件来触发上面的 Javascript 函数。

该过程从第一个选项卡开始。

单击之前的第一个选项卡。

然后,单击文本后,将打开一个新选项卡。但它是空白的!

第二个标签,通过点击打开。

事实证明,原始(现在隐藏)选项卡有一条消息,询问是打开还是保存文件。

警报在第一个选项卡上!

单击“打开”或“保存”即可正常打开文件。但是这个过程非常混乱,并且与其他浏览器不一致。

编辑3:前进一步,后退一步。如果我window.open()用来创建一个新窗口,然后以编程form.target方式将浏览器。更糟糕的是,使用这种技术,新标签不再立即关闭。也许还有另一种技术?

4

1 回答 1

1

一种临时解决方案是检测 IE 和 PDF 插件的可用性,然后在 (>IE9 && !plugin) 情况下将“目标”属性设置为“_self”。我发现PluginDetect声称 Adob​​eReader 插件检测。

总而言之,这是一种相当丑陋且不可靠的方法,但在某些情况下应该会产生结果。

于 2013-02-13T10:56:44.973 回答