3

我有一个 html/javascript 前端,它使用 JQuery 的 AJAX 请求将包含用户输入的表单数据的 XML 发送到后端应用程序,后端应用程序又从该信息创建 PDF。前端收到一个 UUID 作为响应,然后在下载 url 中使用它来下载生成的 PDF。

这在 Firefox 和 Safari 中运行良好,但被 Internet Explorer 8 对脚本下载的保护所阻止。告诉 IE8 通过生成的信息栏下载文件会强制重新加载页面,这会清除所有输入的用户内容。

按钮式元素上的单个 onMouseUp 事件触发生成要发送的 XML,发送 XML,获取其响应,然后通过在 window.location 对象中设置 url 来启动下载。将下载分离到不同的按钮(一个生成并发送 xml 并获取 UUID,另一个仅使用由 UUID 生成的 url 启动下载)绕过信息栏,但破坏了界面的简单性和直观性。

以下是相关的javascript函数:

function sendXml()
{
    var documentXml = generateDocumentXml();
    var percentEncodedDocumentXml = escape(DocumentXml);
    var url = "generate?document=" + percentEncodedDocumentXml;
    $.ajax({
        url: url,
        type: "GET",
        dataType: "xml",
        success: function (xml)
        {
            var uuid = $(xml).find('uuid').text();
            getPdf(uuid);
        },
        error: function (xhr)
        {
            alert("There was an error creating your PDF template");
        }
    });
}

function getPdf(uuid)
{
    var url = "generate?get-pdf=" + uuid;
    window.location = url;
}

我正在寻找有关如何最好地处理此问题的建议。我的第一选择是让信息栏完全不干扰,但将其危害降至最低将是对当前情况的显着改善。如果它无法重新加载并擦除前端界面,并且当用户通过信息栏的菜单选择“下载文件...”时实际继续下载文件,那将有所帮助。

4

1 回答 1

2

我对其进行了测试,出现该栏的原因似乎是这样一个事实,即用户操作(鼠标悬停)和 URL 的加载(猜测 PDF 文件)之间没有直接关系。

此解决方法将解决问题:

在文档中创建一个 iframe(可能被隐藏)并使用

window.open(url,'nameAttributeOfTheIframe') 

...加载 PDF。该栏也会出现,但如果用户选择下载,当前文档也会重新加载,但用户内容(如果您的意思是表单数据)将保留,因为该栏属于 iframe 而不是父文档。

请务必发送带有 PDF 的附件标题,以提防在浏览器中显示它(如果浏览器能够),因为如果您使用隐藏的 iframe,则用户无法看到那里加载的内容。

<iframe name="nameAttributeOfTheIframe" style="display:none"></iframe>
<input type="button" value="click here"  onclick="f1()"/>
<input value="default value">
<script type="text/javascript">
<!--
function f1()
{
   //simulate delayed download
   setTimeout(f2,1000)     
}

function f2()
{
  window.open('http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf','nameAttributeOfTheIframe');      
}

document.getElementsByTagName('input')[1].value='this is modified value, should remain';

//-->
</script>
于 2010-11-30T05:55:32.383 回答