使用ajax调用下载文件时,请避免触发window.onbeforeunload

时间:2015-07-10 15:01:01

标签: web-applications onbeforeunload downloading

我的应用程序信息页面上有一个下载pdf的下载按钮。我还为所有页面设置了window.onbeforeunload事件,以启动我的加载屏幕微调器,window.onunload事件终止了加载屏幕。我遇到的问题是,当我下载我的pdf文件时,下载工作正常,但是window.onbeforeunload事件被触发而不是window.onunload(因为我没有离开页面)。这导致我的加载页面在我下载文件时开始,并且从不停止,使页面看起来在下载时挂起。

我正在使用下面的htm和javascript下载我的SystemInfo.pdf文件:

<a href="#" onclick="SystemInfo()">Download System Info</a>

function SystemInfo(){
    var url = 'xxxxx/about/SystemInfo?isajax=true';
    window.location = formatURL(url);
}

我试图更改链接以使用“下载”属性,但这与Safari和IE不兼容,这是Chrome和Firefox的要求。我还添加了一个动态iframe来解决这个问题但是被告知这是不可取的。如果你能提供帮助,请告诉我。

2 个答案:

答案 0 :(得分:1)

我设法找到一种解决方法,感觉很顺利,并不像添加iframe一样下载。

我在SystemInfo()函数外部创建了一个js变量(oldUnloadValue),我在window.onbeforeunload中分配了原始函数。然后我将window.onbeforeunload设置为我创建的一个单独的函数,它将window.onbeforeunoad设置回原来的状态。这使得window.onbeforeunload在文件下载过程中无效,但在下载完成后重置功能。<​​/ p>

var oldUnloadValue;

function SystemInfo() {
    oldUnloadValue = window.onbeforeunload;
    window.onbeforeunload = ResetOnBeforeUnload;
    var url = 'xxxxx/about/SystemInfo?isajax=true';
    window.location = formatURL(url);
};

function ResetOnBeforeUnload() {
    window.onbeforeunload = oldUnloadValue;
};

以这种方式做事已经解决了我的问题,但仍然感觉不太理想。

答案 1 :(得分:1)

您有两种可能性来正确管理onbeforeunload事件。您可以:

  1. 添加target =“ _ blank”:这样onbeforeunload不会被触发
  2. 或在您的javascript SystemInfo函数中立即或在特定时间后取消微调器
    • stopSpinner()或setTimeout(stopSpinner,1000)