IE10下载问题有两个javascript表单提交

IE10 download issue with two javascript form submits

本文关键字:两个 javascript 表单提交 下载 问题 IE10      更新时间:2023-09-26

所以我认为我有一个有点独特的问题,我不确定解决它的最佳方法是什么。我有一些遗留代码,过去在所有浏览器中都运行良好,但在IE10中突然不起作用了。我会尽力解释它是如何工作的,以及我认为问题出在哪里。

我正在开发一个网上银行页面,用户可以选择将其帐户历史记录下载为QIF、CSV等。该页面是用经典的ASP和VB服务器代码编写的。该功能的工作方式是用户单击下载按钮,该按钮会用一系列可点击的图像重新加载页面,每个下载文件类型一个。根据他们单击的表单,然后调用一个javascript函数,该函数在页面上提交一个隐藏表单,然后提交第二个隐藏表单以重新加载带有帐户历史记录的原始视图并再次进行筛选。第一个表单操作调用一个asp页面,该页面构建文件并将其作为响应附件返回,通常会提示浏览器下载文件,然后第二个提交操作只是包含历史详细信息的原始asp页面。在IE10中,文件永远不会下载,而是会进行一些处理,重新加载历史记录的第二次提交会顺利完成。

我在查找中发现,如果我注释掉提交第二个表单的javascript行,那么下载就可以了,所以我认为发生的是提交是异步发生的,重定向在下载之前返回。或者类似的东西。我不确定。我正试图在不需要完全重写功能的情况下找到解决方案。有什么想法吗?

编辑:

发生这一切的页面是accountDetails.asp

javascript——

function SetOFX(type){
    // There is some code that does conditional handling of the @type parameter
    document.forms.DownloadForm.submit();
    document.forms.Finished.submit();
    return false
}

下载表格——

<form name="DownloadForm" id="DownloadForm" action="downloadofx.asp" method="post">
    <!-- a bunch of input type="hidden" elements -->
</form>

成品形式——

<form name="Finished " id="Finished " action="accountDetails.asp" method="post">
    <!-- a bunch of input type="hidden" elements -->
</form>

因此,DownloadForm调用一个单独的asp页面来获取下载文件,然后Finished表单发布到用户已经所在的页面,以重新加载帐户历史记录详细信息,而不是显示下载图像按钮。我一开始就意识到这是一种非常糟糕的方式;这是由正在学习的人编写的遗留代码,已经被数百名客户用于生产,所以如果没有老板和所有客户的重大项目批准,我不能直接重写它。

iI还没有测试过这些想法,但如果你想保持当前的架构,你可以尝试检测文件何时完全下载,然后导航离开。

看看这个问题,了解如何检测浏览器何时下载了文件。

另一个想法是放弃第一个表单提交,转而使用一个简单的a链接,该链接具有指向文件下载链接的href属性,使用查询字符串参数来传递附加数据。如果没有taget="_blank"仍然遇到同样的问题,您可能还想将其放在链接上。

这是我们最终得出的答案。上面的javascript本来就不应该起作用,事实上,我们在测试后发现,它在很多地方都不起作用,但我们关心的部分(文件下载(一直在起作用。事实证明,直到IE10,所有的浏览器都足够聪明,知道你不应该以这种方式提交两个表单,结果他们忽略了第二次提交。然而IE10正在处理这两个文件,重定向在文件下载之前返回。由于我们不关心自动重定向,所以我们只是去掉了提交,而是在完成的表单中添加了一个提交按钮,这样用户就可以手动返回到以前的视图。

固定的Javascript——

function SetOFX(type){
    // There is some code that does conditional handling of the @type parameter
    document.forms.DownloadForm.submit();
    return false
}

固定的成品

<form name="Finished" id="Finished" action="accountDetails.asp" method="post">
    <!-- a bunch of input type="hidden" elements -->
    <input type="submit" value="Return to Account Details" />
</form>