Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测在触发window.onbeforeunload时是否单击了链接?_Javascript - Fatal编程技术网

Javascript 如何检测在触发window.onbeforeunload时是否单击了链接?

Javascript 如何检测在触发window.onbeforeunload时是否单击了链接?,javascript,Javascript,在正确卸载之前,我有window.on。它会显示一个确认框,以确保用户知道他们正在导航(关闭)窗口,并且任何未保存的工作都将被删除 我有一个独特的情况,如果用户通过单击链接离开页面,我不希望触发此事件,但我不知道如何检测是否在函数内部单击了链接以停止函数。这就是我的代码: window.onbeforeunload = function() { var message = 'You are leaving the page.'; /* If this is Firefox */ if(/Fir

在正确卸载之前,我有window.on。它会显示一个确认框,以确保用户知道他们正在导航(关闭)窗口,并且任何未保存的工作都将被删除

我有一个独特的情况,如果用户通过单击链接离开页面,我不希望触发此事件,但我不知道如何检测是否在函数内部单击了链接以停止函数。这就是我的代码:

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
}