Javascript 如何下载通过post生成的php文件,同时避免更改页面位置?

Javascript 如何下载通过post生成的php文件,同时避免更改页面位置?,javascript,php,html,ajax,download,Javascript,Php,Html,Ajax,Download,我有一个文件download.php,我通过post向其提供数据,然后通过使用 header('Content-Type: application/svg+xml'); header("Content-Disposition: attachment; filename=\"myfilename\""); 现在,问题是如何启动下载。我的第一次尝试是将数据放入一个表单中,并通过post提交给 <form id="svgform" method="post" action="download.

我有一个文件
download.php
,我通过post向其提供数据,然后通过使用

header('Content-Type: application/svg+xml');
header("Content-Disposition: attachment; filename=\"myfilename\"");
现在,问题是如何启动下载。我的第一次尝试是将数据放入一个表单中,并通过post提交给

<form id="svgform" method="post" action="download.php" style="display: none;">
    ...
</form>

...
通常情况下,这很好。它不会将位置更改为download.php,只会启动下载。不幸的是,这种方法似乎有一个警告(在罕见的情况下),当php请求生成错误(无论出于何种原因)时,页面会被更改。我希望不惜一切代价避免页面更改(因为未保存的数据可能会丢失)。它还有其他一些奇怪的副作用[1]

所以,接下来我尝试通过一个新的标签启动下载

<form id="svgform" method="post" target="_blank" action="download.php" style="display: none;">
    ...
</form>

...
这会导致在下载开始前弹出一个丑陋的白色页面。更糟糕的是,在IE 11中,白色页面没有关闭,下载对话框落在前一页上,因此用户不会立即看到它

所以,我想知道最好的方法是什么。通过AJAX可以更好地实现下载吗?如何实现


[1] 由于某些原因,Firefox无法在以前打开检查器时生成html检查器数据。这里有一个方法来理解我的意思。检查Firefox中的某些元素,并使检查器保持打开状态。现在,转到通过上述方法(或类似方法)下载数据的页面,例如。检查器变为空,无法再检查任何元素。此外,我的一些脚本在IE11中停止正常工作。我还不确定为什么它可能与Firefox中发生的事情有关。

既然您不想在发布表单时更改URL,但仍然希望开始下载,您可以将表单发布到iframe

<form target="my-iframe-id" method="post" ... >

以及iframe:

<iframe id="my-iframe-id" ... ></iframe>


您可以将iframe设置为
display:none因此它不会显示。

您可以将表单发布到隐藏的iframe。不确定我是否正确理解了您的问题,但锚元素可以具有download属性,这实际上使浏览器下载而不是呈现给定url中的内容:@MladenIlić但随后我必须通过javascript而不是PHP生成要使用的数据,正确的?(不幸的是,我不能这样做,因为我依赖于php脚本ImageMagick。)@MagnusEriksson听起来不错。我是否只是添加一个带有id的隐藏iframe并将表单的目标设置为该id?是的,应该这样做。