【发布时间】:2020-10-09 02:45:12
【问题描述】:
我是 JavaScript 新手。
这是一个下载确认页面。我在页面上有一个下载按钮。
我想捕获关闭窗口事件以删除在AjaxHandler.ashx 中处理的临时pdf。
通过下面的代码,我发现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() {
...
})
更新
根据回答者javascript - Disable AddEventListener on Submit - Stack Overflow,
我尝试设置像submitting 这样的标志,但我发现如果我通过检查click 按钮来使用标志,当我在按钮之后关闭窗口时,处理程序将不会被执行,因为button 标志有已设置true。但我想检查每次触发 addEvenListener 时按钮是否单击。
对不起,我的英语不好,希望我能被理解。
谢谢。
【问题讨论】:
-
你只是在执行函数,应该是
window.addEventListener("beforeunload", deletePDF, false); -
@AlonEitan 它有效,谢谢。但是下载按钮也会触发deletePDF,我尝试使用
(window.event.clientY<0)来限制,但是关闭窗口失败了。 -
@AlonEitan 嗨,谢谢,但是当我使用 jquery 的
.on()和off时,什么也没有发生。 -
附加事件?你引用了哪些古代文章。
标签: javascript jquery asp.net