Javascript 如何基于变量';进行onbeforeload触发的条件ajax调用;s值
我的脚本使用“onbeforeunload”、ajax和logout.php(用loggedin状态1或0更新mysql)来提供用户登录的“实时”状态。这样,如果用户关闭他们的标签,或者如果他们关闭他们的浏览器(未测试),mysql将能够跟踪他们的登录状态,而如果我监视cookies,他们仍然会显示为使用活动会话登录 问题是,这会导致每次页面刷新或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没有触发ajax注销,F5刷新或关闭选项卡应该是这样的 if语句是否不识别变量?他们的方法更好吗?一如既往,我真的很感谢你的洞察力和帮助。多谢各位 下面是适用的代码。(我尝试使用localstorage变量。运气不好…) header.php:Javascript 如何基于变量';进行onbeforeload触发的条件ajax调用;s值,javascript,jquery,ajax,Javascript,Jquery,Ajax,我的脚本使用“onbeforeunload”、ajax和logout.php(用loggedin状态1或0更新mysql)来提供用户登录的“实时”状态。这样,如果用户关闭他们的标签,或者如果他们关闭他们的浏览器(未测试),mysql将能够跟踪他们的登录状态,而如果我监视cookies,他们仍然会显示为使用活动会话登录 问题是,这会导致每次页面刷新或href链接被单击时将我注销 我试图通过向onbeforeunload调用的ajax添加if语句来解决这个问题。如果变量为“var unload==t
<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>
const getPulse = () => $.get("/pulse.php");
setInterval(getPulse, 300000); // This fn will be fired every 5 minutes
setItem(“unload”、“true”);
window.onbeforeunload=函数(){
if(localStorage.getItem('unload')==“true”){
$.ajax({
async:false,
类型:“POST”,
url:“/WIP/secure\u login/logout.php”,
enctype:“多部分/表单数据”,
成功:功能(resp){
window.alert(“您现在应该注销了。”);
}
});
}
};
document.getElementsByClassName(“导航链接”).addEventListener(“单击“,
函数(){
setItem(“unload”、“false”);
};
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>
document.getElementById(“提交”).addEventListener(“单击”,函数)(){
setItem(“unload”、“false”);
$.ajax({
async:true,
类型:“POST”,
url:“../header.php”,
enctype:“多部分/表单数据”,
成功:功能(结果){
location.reload();
}
});
});
setItem(“unload”、“true”);
我们的期望是确定谁是积极的“loggedIn”,谁不是。您当前的方法是错误的。您可以实现以下目标:
我会这样做:
首先-
创建一个新页面,将其命名为pulse.php
。此php文件将负责查询用户表中的$currentUser并更新时间戳(例如:updated_at
),并可能将布尔列(例如:active
)设置为true。这是可选的,取决于您的用户模型架构
下一个-
将以下javascript添加到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>
const getPulse = () => $.get("/pulse.php");
setInterval(getPulse, 300000); // This fn will be fired every 5 minutes
最后-
设置一个计划任务(即cron作业),以便在服务器上每隔5分钟运行一次。此任务将负责查询用户表,其中
USER.updated\u的时间从现在起超过5分钟(),并且USER.active=true
。此查询返回的任何结果都将是不再在线的用户(即关闭他们的浏览器选项卡)。您现在可以相应地更新这些用户记录。我明白了,这一切的目的是跟踪谁在主动“登录”谁不是呢?也就是说,谁实时出现在网站上?是的,你能想到为什么onbeforeunload if语句不能像人们希望的那样运行的原因吗?是的,有很多原因…请看我的答案,以现实世界的方式解决你的问题。这是我问题的一个非常可行的解决方案。谢谢。我似乎无法获得时间域(mysl time format)使用time()进行更新(php函数)。它只显示一次,不会在每次调用查询时更新。