IE9和10中的target="_blank"行为更改导致表单问题

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,则会打开新标签页,立即关闭该标签页并下载文件。

似乎在IE 9及以上版本中,第二种情况已经改变。它将打开一个新标签页,但只会显示空白屏幕,直到用户返回原始标签页,点击“打开”或“保存”,然后PDF才会按预期下载。这是一个非常令人困惑的界面。

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

(注意:这与PDF无关;任何浏览器可能下载而不是本地显示的文件似乎都存在问题。)
编辑:看起来我比我意识到的还要落后。它似乎也发生在IE9中,我从未尝试过没有安装PDF插件或使用其他文件类型。
有趣的是,如果我从表单中删除输入字段,上面的代码就像我期望的那样工作。我不确定为什么浏览器会以任何不同的方式处理它。当然,在我的情况下,我需要输入将数据发布到我的脚本。
编辑2:愚蠢的错误。输入是自闭合的。已修复。
编辑3:以下是一些截图,以更好地解释问题。我正在使用this JSBin进行测试。我有一个onclick事件来触发上面的JavaScript函数。
该过程始于第一个选项卡。

First tab, before a click.

然后,一旦您点击了文本,会打开一个新的标签页。但是它是空白的!

Second tab, opened via click.

原来(现在隐藏的)选项卡上有一条消息询问是否打开或保存文件。

The alert is on the first tab!

点击“打开”或“保存”将正常打开文件。但是这个过程非常令人困惑,并且与其他浏览器不一致。
编辑3:向前迈出一步,向后退一步。如果我使用window.open()创建一个新窗口,然后以编程方式将form.target设置为该窗口的名称,我至少可以在打开的选项卡中获得“打开/保存”消息...尽管我更喜欢它像其他浏览器一样立即关闭选项卡。更糟糕的是,使用那种技术,新选项卡不再立即关闭。也许还有其他技术?

1
一个<input>标签没有</input>的结束标签 - 它是一个自包含的标签。可能由于HTML格式不正确而无法工作。 - sbeliv01
也许在输入标签中的属性周围添加引号会有所帮助?<input type='hidden' id='test' name='test' value='test'> - sbeliv01
@sbeliv01 不是,我刚试过了。我相当确定这不完全是HTML验证问题。新标签页可以正常打开...只是“打开/保存”选项出现在之前的标签页上,而该标签页现在已隐藏。老实说,如果有更好的方法将数据POST到新标签页中,我非常乐意倾听。 - David Alan Hjelle
1
新标签页应该自动关闭,因为它不用于文件下载,而是由原始页面接管。目标URL是否位于与原始页面不同的安全区域?您是否在多个客户端上进行了复制? - EricLaw
@EricLaw 我很高兴有其他人认为新标签页应该自动关闭——这是我在其他浏览器中看到的行为,也是我正在寻找的。而且,是的,我已经在多个客户端上重现了它——这是由一位客户报告的,并且我已经在Windows 7和8的办公室中能够重现它。安全区域问题很有趣。这在我们的生产应用程序中不应该是这种情况(所有URL都在同一个域中),但我应该进行一些研究,以确保我的jsbin示例是准确的。 - David Alan Hjelle
显示剩余3条评论
1个回答

1
一种简单的解决方法是检测IE和PDF插件的可用性,然后在(>IE9 && !plugin)的情况下设置“目标”属性为“_self”。我发现PluginDetect声称可以检测AdobeReader插件。
总的来说,这是一种相当丑陋和不可靠的方法,但在某些情况下应该能够产生结果。

然而,真正的问题是这也发生在Excel文件中。(也许只有在未安装Office或某些ActiveX组件时?还没有缩小范围。)不过还是谢谢。 - David Alan Hjelle
当然……现在我再想一想……我可以强制将Excel文件始终打开在“_self”中。有趣! - David Alan Hjelle
@DavidAlanHjelle:文档显示Acrobat是通过ActiveX查找检测的,似乎这是IE检测任何插件的方式。发现了这个ActiveXHelper [http://www.nirsoft.net/utils/axhelper.html]。 - Bizniztime
谢谢!有趣的是,我已经检测到Adobe插件用于其他目的...我需要更深入地研究Excel的细节。 (我希望得到一个不那么hacky的答案;但如果我找不到其他答案,我会接受你的建议。) - David Alan Hjelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接