jQuery卸载事件仅用于关闭窗口而不用于链接导航

我在关闭页面时使用此代码注销用户,但用户也会在点击其他链接(同一网站)时注销:

$( window ).unload(function() { $.ajax({url:"?logout&leave=yes", async:false}) }); 

有没有办法区分链接导航和真实页面关闭?

编辑:

我目前正在实施此解决方案,但它缺乏检测页面重新加载

  $('a').click(function(){ var url = $(this).attr("href"); window.onbeforeunload = null; $(window).unbind('beforeunload'); window.location = url; }); 

尝试以下解决方案,希望这会有所帮助

  

要么

 var logOutFlag = true; $('a').click(function(){ logOutFlag = false; }); $(window).bind('beforeunload', function(event) { if(logOutFlag){ $.ajax({url:"?logout&leave=yes", async:false}); } }); 

这个问题已被问过几次:

javascript检测浏览器关闭选项卡/关闭浏览器
如何使用javascript或php检测窗口关闭事件
如果选项卡已关闭,则自动注销
你可以找到很多其他的。

简短的回答是:你做不到。 正如其他答案所说:实际上还有许多其他合法案例,用户在关闭标签时肯定不想注销(在两个标签中打开相同的网站,点击书签,在导航栏中手动修改url… )。

我知道检测用户是否想要注销的唯一方法是在页面上放置“注销”按钮。
否则,您应该管理您的sesions的超时机制(例如:在服务器端,在说不活动30分钟后删除会话)。

无法知道用户离开页面时想要去哪里。

而不是在单击时手动取消绑定事件,您可以设置一个标志,并在设置此标志时在unload回调中跳过AJAX请求。 另请注意, $(window).unload()已弃用,应替换为: $(window).on('unload', function() {})

我能想到的唯一解决方案是在页面unload在cookie(或LocalStorage)中设置值,并检查是否在页面加载时设置了此值。 但是,如果您只想在用户离开您的应用时发送AJAX请求,那么这将无效。

不过,我担心我们会遇到XY问题 。 你不能在服务器端设置某种超时,一旦他不活动就会正确地注销用户吗? 即使有链接技巧,如果用户多次登录,如果他打开一个新的窗口/选项卡,或者他只是让页面在后台运行,那么您当前的解决方案将不起作用。

链接不是唯一的问题,如果用户编辑url并重新提交或只是刷新页面以查看新内容该怎么办。 或者如前所述,如果用户打开了2个或更多窗口,并关闭了一个窗口,它是否会注销另一个窗口?