如何根据变量的值进行onbeforeload触发的条件ajax调用

时间:2018-05-11 02:23:30

标签: javascript jquery ajax

我的脚本使用" onbeforeunload",ajax和logout.php(以登录状态1或0更新mysql)以提供" live"用户登录状态。这样,如果用户关闭他们的选项卡,或者希望他们关闭浏览器(未经测试),mysql将能够跟踪他们的登录状态,而如果我监视cookie,他们仍然会显示为使用他们的活动会话登录。

问题是这会使每个页面刷新或点击的href链接都将我注销。

我尝试通过向onbeforeunload调用的ajax添加if语句来解决这个问题。如果变量说&#3​​4; var unload == true",这将执行ajax注销。我的header.php脚本在所有网站页面上,我添加了var unload = true;它。(在每个页面加载时重置由onbeforeunload触发的ajax)

对于我的链接,我尝试使用onclick来关闭"关闭"通过设置unload = false来注销ajax。 它应该是"打开"再次使用header.php的代码var unload = true,因为它位于每个页面上。

现在它已关闭,并且onbeforeunload不会触发带有F5刷新或关闭标签的ajax注销。

if语句是否无法识别变量?他们是一个更好的方式来解决这个问题吗?一如既往,我非常感谢您的见解和帮助。谢谢。

以下是适用的代码。(我尝试使用localstorage变量。没有运气......)

的header.php:

<script>
localStorage.setItem("unload","true");

window.onbeforeunload = function() { 

 if(localStorage.getItem('unload')=="true"){
 $.ajax({
        async:false,
        type:"POST",
        url: "/WIP/secure_login/logout.php",
        enctype: 'multipart/form-data',
        success: function(resp){
        window.alert("you should be logged out now.");

           }

    });
}
};
document.getElementsByClassName("nav-link").addEventListener("click", 
function(){
localStorage.setItem("unload","false");
};
</script>

demo.php

<?php
include '../header.php';
?>
<script>
document.getElementById("submit").addEventListener("click", function(){
localStorage.setItem("unload","false");

  $.ajax({
        async:true,
        type:"POST",
        url: "../header.php",
        enctype: 'multipart/form-data',
        success: function(result){
            location.reload();
        }   
    });
});
localStorage.setItem("unload","true");
</script>

1 个答案:

答案 0 :(得分:0)

期望是确定谁是主动“登录”而谁不是。您当前的方法是错误的。您可以按如下方式实现目标:

我会做这样的事情:

首先 - 创建一个新页面,称之为pulse.php。这个php文件将负责查询$ currentUser的 Users 表并更新时间戳(例如:updated_at)并可能设置一个布尔列(例如:active)为真。这是可选的,取决于您的用户模型架构。

下一个 - 将以下javascript添加到header.php:

const getPulse = () => $.get("/pulse.php");
setInterval(getPulse, 300000); // This fn will be fired every 5 minutes

最后 - 设置一个计划任务(即cron作业),在服务器上每5分钟运行一次。此任务将负责查询USER.updated_at time is longer than 5 minutes from NOW() AND USER.active = true中的Users表。 此查询返回的任何结果都将是不再主动联机的用户(即关闭其浏览器标签)。您现在可以相应地更新这些用户记录。