【问题标题】:how to make a conditional ajax call triggered by onbeforeload based on a variable's value如何根据变量的值进行由onbeforeload触发的条件ajax调用
【发布时间】:2018-05-11 02:23:29
【问题描述】:

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

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

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

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

现在它已关闭,并且 onbeforeunload 不会按应有的 F5 刷新或关闭选项卡触发 ajax 注销。

if 语句不能识别变量吗?他们是解决这个问题的更好方法吗?一如既往,我非常感谢您的洞察力和帮助。谢谢。

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

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>

【问题讨论】:

  • 我明白了,所有这些的目的是跟踪谁是积极“登录”,谁不是? IE。谁实际上是实时在网站上的?
  • 是的,您能想到为什么 onbeforeunload if 语句似乎没有按预期运行的任何原因吗?
  • 是的,有很多原因...请参阅我的回答,了解解决问题的实际方法。

标签: javascript jquery ajax


【解决方案1】:

期望确定谁积极“登录”,谁没有。您当前的方法是错误的。您可以通过以下方式实现您的目标:

我会这样做:

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

下一个- 将以下 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 表。 此查询返回的任何结果都将是不再活跃在线的用户(即关闭他们的浏览器选项卡)。您现在可以相应地更新这些用户记录。

【讨论】:

  • 解决我的问题的一个非常可行的方法。谢谢。
  • 我似乎无法使用 time()(php 函数)获取时间字段(mysl 时间格式)来更新。它只是显示一次,不会在每次调用查询时更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2013-04-15
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多