Javascript 如何检测在触发window.onbeforeunload时是否单击了链接?
在正确卸载之前,我有window.on。它会显示一个确认框,以确保用户知道他们正在导航(关闭)窗口,并且任何未保存的工作都将被删除 我有一个独特的情况,如果用户通过单击链接离开页面,我不希望触发此事件,但我不知道如何检测是否在函数内部单击了链接以停止函数。这就是我的代码:Javascript 如何检测在触发window.onbeforeunload时是否单击了链接?,javascript,Javascript,在正确卸载之前,我有window.on。它会显示一个确认框,以确保用户知道他们正在导航(关闭)窗口,并且任何未保存的工作都将被删除 我有一个独特的情况,如果用户通过单击链接离开页面,我不希望触发此事件,但我不知道如何检测是否在函数内部单击了链接以停止函数。这就是我的代码: window.onbeforeunload = function() { var message = 'You are leaving the page.'; /* If this is Firefox */ if(/Fir
window.onbeforeunload = function() {
var message = 'You are leaving the page.';
/* If this is Firefox */
if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) {
if(confirm(message)) {
history.go();
}
else {
window.setTimeout(function() {
window.stop();
}, 1);
}
}
/* Everything else */
else {
return message;
}
}
您正在寻找延迟事件处理。我将解释如何使用jQuery,因为它的代码更少:
window._link_was_clicked = false;
window.onbeforeunload = function(event) {
if (window._link_was_clicked) {
return; // abort beforeunload
}
// your event handling
};
jQuery(document).on('click', 'a', function(event) {
window._link_was_clicked = true;
});
没有jQuery方便的委托处理的(非常)可怜的人的实现可能看起来像:
document.addEventListener("click", function(event) {
if (this.nodeName.toLowerCase() === 'a') {
window._link_was_clicked = true;
}
}, true);
这允许页面上的所有链接离开,而无需调用
beforeunload
处理程序。我相信,如果您只想为一组特定的链接(您的问题不是特别清楚)启用此功能,您可以找到如何自定义此功能。您可以通过使用计时器对链接卸载
或重新加载/用户输入不同地址卸载
进行区分。这样您就知道卸载前的是在单击链接后直接触发的
使用jQuery的示例:
$('a')。在('click',function()上{
window.last_clicked_time=new Date().getTime();
window.last_clicked=$(此);
});
$(窗口).bind('beforeunload',function(){
var time_now=new Date().getTime();
var link_clicked=window.last_clicked!=未定义;
点击偏移量内的变量=(现在时间-窗口。上次点击时间)<100;
如果(链接被点击&&在点击偏移内){
return“您单击了“+窗口的链接。上次单击[0]。href+”;
}否则{
return“您正在离开或重新加载页面!”;
}
});
(铬合金测试)非常感谢您的回复。我试图在没有jQuery的情况下使用它——我试图找出如何集成poormans实现,但似乎无法找到它(请原谅,我有点JS新手)。您的代码是半正确的。我已经用完整的答案回答了这个问题。如果任何人在IE中有问题,我必须返回undefined而不是null。在ie和chrome中都可以使用。关于你的第二个代码块:这个处理程序中的
将始终引用文档
,它显然永远不会是元素。2013年,您需要一个循环,从event.target
开始,在this
停止,并检查其间的每个元素。2018年,在真正最新的现代浏览器上,您可以使用DOM新的最近的
函数(与jQuery非常类似):if(event.target.closest(“a”)
…IE,Edge,Firefox?
var link_was_clicked = false;
document.addEventListener("click", function(e) {
if (e.target.nodeName.toLowerCase() === 'a') {
link_was_clicked = true;
}
}, true);
window.onbeforeunload = function() {
if(link_was_clicked) {
link_was_clicked = false;
return;
}
//other code here
}