0

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

  $( 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;
  });
4

4 回答 4

5

尝试以下解决方案,希望对您有所帮助

<script>
$(window).bind('click', function(event) {
    if(event.target.href) 
        $(window).unbind('beforeunload');
});
$(window).bind('beforeunload', function(event) {
    $.ajax({url:"?logout&leave=yes", async:false});
});
</script>

或者

var logOutFlag = true;
$('a').click(function(){
    logOutFlag = false;
});
$(window).bind('beforeunload', function(event) {
    if(logOutFlag){
         $.ajax({url:"?logout&leave=yes", async:false});   
    }
});
于 2013-10-26T19:45:29.160 回答
4

这个问题已经被问过好几次了:

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

简短的回答是:你不能。正如其他答案所说:实际上还有许多其他合法情况,用户在关闭选项卡时肯定不想注销(在两个选项卡中打开同一站点,单击书签,在导航栏中手动修改 url ... )。

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

于 2013-10-29T10:01:36.763 回答
1

没有办法知道用户离开您的页面时想去哪里。

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

我能想到的唯一解决方案是在页面上的 cookie(或 LocalStorage)中设置值,unload并检查该值是否在页面加载时设置。但是,如果您只想在用户离开您的应用程序时发送 AJAX 请求,这将不起作用。

不过,恐怕我们正面临一个XY 问题。您不能在服务器端设置某种超时,一旦用户处于非活动状态,它将正确注销用户?即使使用链接技巧,如果用户多次登录,如果他打开一个新窗口/选项卡,或者如果他只是让页面在后台运行,您当前的解决方案也将不起作用。

于 2013-10-26T19:50:17.943 回答
0

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

于 2013-10-29T00:23:32.760 回答