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

时间:2013-10-24 11:55:02

标签: jquery ajax javascript-events event-handling

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

  $( 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 个答案:

答案 0 :(得分: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});   
    }
});

答案 1 :(得分:4)

这个问题已被多次询问:

javascript detect browser close tab/close browser
How to detect a window close event using javascript or php
Automatic logout if the tab is closed
你可以找到很多其他人。

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

相关问题