我是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();
})
假设这种情况:
- userA进入页面,点击下载,现在是
download = true
- 用户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);
现在我没有环境来测试差异,而且两者在我的项目本地测试中都能很好地工作。
更新
unload
和pagehide
都不能在FF中正常工作。