通过beforeunload但排除asp按钮捕获关闭窗口



我是javascript的新手。

这是一个下载确认页面。我在页面上有一个下载按钮。

我想捕获关闭窗口事件以删除在AjaxHandler.ashx中处理的临时pdfs。

使用下面的代码,我发现deletePDF将在窗口初始化时执行,当下载bottun点击时执行,但在关闭窗口时不会执行。

我知道beforeunload在某些情况下会被激活,但为什么当我关闭窗口时它不起作用?(已解决,更新代码下方(

if (window.attachEvent) {
window.attachEvent("beforeunload", deletePDF());
}
else if (window.addEventListener) {
window.addEventListener("beforeunload", deletePDF(), false);
}

function deletePDF(event) {
var link = "Handler/AjaxHandler.ashx?filestring=" + getQueryStringByName("filestring");
$.ajax({
type: "get",
cache: false,
url: link,
beforeSend: function (XMLHttpRequest) {
},
success: function (data, textStatus) {
},
complete: function (XMLHttpRequest, textStatus) {
},
error: function () {
}
});
}

更新

我通过Alon Eitan评论点更正了addEventListener中的deletePDF()deletePDF

现在,当我单击下载按钮并单击"X"关闭窗口时,代码将跳转到deletePDF

我尝试使用clientY来限制事件。但它无法对关闭窗口的动作做出反应。(我知道我很怀念用键盘关闭窗口的情况,希望有人能有更好的解决方案(

if (window.event.clientY < 0 )
...

按钮类似:

<asp:Button ID="btnDownload" runat="server" CssClass="Button" Text="Download" Width="100px" CommandName="download" />

更新

根据Alon Eitan的最后建议,我尝试使用下面的代码来排除asp按钮。

在Edge、Chrome、FF中,当窗口关闭时,.on().off().bind().unbind()都无法触发。我还尝试将async:false添加到ajax中。

但在IE11中,当窗口关闭并点击按钮时,.bind().unbind()触发,.on()得到错误

对象不支持属性或方法"on">

$("[id$='_btnDownload']").click(function () {
$(window).off("beforeunload");
// $(window).unbind("beforeunload");
})
$(window).on('beforeunload', function() {
//$(window).bind('beforeunload', function() {
...
})

更新

根据anwser javascript-Disable AddEventListener on Submit-Stack Overflow,我试图设置一个类似submitting的标志,但我发现如果我通过检查click按钮来使用标志,当我关闭按钮后的窗口时,处理程序将不会执行,因为button标志已设置为true。但我想检查每次触发addEvenListener时按钮是否点击。

很抱歉我的英语不好,希望我能被理解。

谢谢。

最后,我使用一个标志来记录下载状态,如果状态为true,则将其清除,以返回每次检查的初始状态。我使用以下代码:

var download = false;
document.addEventListener("click", function () {
download = true;
})
window.addEventListener("beforeunload", function() {
if (download)
download = false;
else
deletePDF();
})

假设这种情况:

  1. userA进入页面,点击下载,现在是download = true
  2. 用户B进入页面,直接关闭窗口,现在是download=ture,这样用户B生成的临时文件就不会被删除

我在localhost中测试,在没有调试的情况下启动,在不同的浏览器中打开两个窗口,这种情况不会发生。我不确定这种方法是否有局限性。


更新

我发现在我的情况下,我不需要与用户核实。这样我就可以使用unload而不是beforeunload,而且我不需要设置标志。

window.addEventListener("unload", deletePDF);

更新

根据页面生命周期API | Web | Google Developers,不推荐使用unload,正如文章所建议的,我们应该使用pagehide。根据Window:pagehide event-Web API|MDN,似乎所有浏览器都支持它,但如果你想支持ie10及更低版本,你可以看到你必须使用unload

var terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';
window.addEventListener(terminationEvent, deletePDF);

现在我没有环境来测试差异,而且两者在我的项目本地测试中都能很好地工作。


更新

unloadpagehide都不能在FF中正常工作。

最新更新