2013-03-07 124 views
5

我有window.onbeforeunload正确触发。它显示一个确认框,以确保用户知道他们正在浏览(关闭)窗口,并且任何未保存的作品都将被删除。当window.onbeforeunload被触发时如何检测链接是否被点击?

我有一个独特的情况,我不希望这触发如果用户通过单击链接导航离开页面,但我无法弄清楚如何检测链接是否已被点击功能停止功能。这是我对代码:

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; 
} 
} 

回答

6

你要找的延迟事件处理。我会解释使用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处理程序的情况下离开。我相信你可以想出如何定制这个,如果你只想让这个特定的链接(你的问题不是特别清楚)。

+0

这是您的答复十分感谢。我试图在没有jQuery的情况下使用它 - 我试图找出如何整合poormans的实现,但似乎无法弄清楚(原谅我,我是一个JS新手)。 – mirin 2013-03-08 15:00:52

+0

你的代码是半正确的。我已经用完整的答案回答了这个问题。 – mirin 2013-03-09 16:42:42

+0

如果任何人有问题让它在IE中工作,我不得不返回undefined而不是null。适用于ie和chrome。 – Janspeed 2017-03-29 06:53:23

3
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 
} 
1

可以通过使用计时器的link unloadreload/user entering a different address unload S之间不同。这样您就知道beforeunload是在链接点击后直接触发的。

实施例使用jQuery:

$('a').on('click', function(){ 
    window.last_clicked_time = new Date().getTime(); 
    window.last_clicked = $(this); 
}); 

$(window).bind('beforeunload', function() { 
    var time_now = new Date().getTime(); 
    var link_clicked = window.last_clicked != undefined; 
    var within_click_offset = (time_now - window.last_clicked_time) < 100; 

    if (link_clicked && within_click_offset) { 
    return 'You clicked a link to '+window.last_clicked[0].href+'!'; 
    } else { 
    return 'You are leaving or reloading the page!'; 
    } 
}); 

(Chrome中测试)