Php 关闭选项卡时清除会话变量

Php 关闭选项卡时清除会话变量,php,javascript,jquery,ajax,session-variables,Php,Javascript,Jquery,Ajax,Session Variables,当选项卡关闭时,我需要清除会话变量,但到目前为止我找不到任何解决方案。我得到的最接近于使用“onbeforeunload”函数的是javascript <body onbeforeunload='destroySession()'> <!--Codes for the site includeing php scripts--> </body> <script type='text/javascript'> function des

当选项卡关闭时,我需要清除会话变量,但到目前为止我找不到任何解决方案。我得到的最接近于使用“onbeforeunload”函数的是javascript

<body onbeforeunload='destroySession()'>
    <!--Codes for the site includeing php scripts-->
</body>
<script type='text/javascript'>
    function destroySession(){
        $.ajax({
           url: "destroySession.php"
        });
     }
<script>

函数会话(){
$.ajax({
url:“destroySession.php”
});
}

问题在于,每次单击、刷新新链接或提交表单时,都会调用该函数。是否有更好的方法在关闭选项卡时销毁会话变量,还是我做错了什么?请提供帮助。

不幸的是,无法阻止页面刷新(由表单提交或任何其他导航引起)调用“onbeforeunload”。

没有安全的方法来处理您正在查找的内容。每次离开页面时都会执行onbeforunload事件。(昨天我的一个项目遇到了类似的问题)。最接近的方法是控制用户如何离开页面

请参阅lan在一些评论中发布的这篇文章。然后通过检查答案,该答案与此问题的解决方案尽可能接近

我也发现了这一点,但它基本上是对stackoverflow中给出的答案的提取

希望这有帮助。

是的,你可以做到

</head>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" language="javascript">

var validNavigation = false;

function endSession() {
// Browser or broswer tab is closed
// Do sth here ...
alert("bye");
}

function wireUpEvents() {
/*
* For a list of events that triggers onbeforeunload on IE
* check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
*/
window.onbeforeunload = function() {
  if (!validNavigation) {
     endSession();
  }
 }

// Attach the event keypress to exclude the F5 refresh
$(document).bind('keypress', function(e) {
if (e.keyCode == 116){
  validNavigation = true;
}
});

// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});

 // Attach the event submit for all forms in the page
 $("form").bind("submit", function() {
 validNavigation = true;
 });

 // Attach the event click for all inputs in the page
 $("input[type=submit]").bind("click", function() {
 validNavigation = true;
 });

}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
wireUpEvents();  
}); 
</script>    
</head>
<body>
<h1>Eureka!</h1>
  <a href="http://www.google.com">Google</a>
  <a href="http://www.yahoo.com">Yahoo</a>
</body>
</html>

var validNavigation=错误;
函数endSession(){
//浏览器或浏览器选项卡已关闭
//在这里做某事。。。
警惕(“再见”);
}
函数wireUpEvents(){
/*
*获取在IE上卸载之前触发onbeforeunload的事件列表
*检查http://msdn.microsoft.com/en-us/library/ms536907(第85节)
*/
window.onbeforeunload=函数(){
如果(!有效航行){
endSession();
}
}
//附加事件按键以排除F5刷新
$(文档).bind('keypress',函数(e){
如果(e.keyCode==116){
有效航行=真;
}
});
//单击页面中的所有链接附加事件
$(“a”).bind(“单击”,函数(){
有效航行=真;
});
//为页面中的所有表单附上事件提交
$(“表单”).bind(“提交”,函数(){
有效航行=真;
});
//为页面中的所有输入附加事件单击
$(“输入[type=submit]”)。绑定(“单击”,函数(){
有效航行=真;
});
}
//DOM树准备就绪后,立即连接事件
$(文档).ready(函数(){
wireUpEvents();
}); 
尤里卡!

相信我,停下来。你不可能完全可靠地做到这一点。您可以通过某些方式(单击链接、提交表单等)检测页面被导航的方式,但无法区分“关闭选项卡”和“导航”以及许多其他事件。不幸的是,我们不能做这类事情(因为像您要求的那样清除会话会很好),但事情并没有设置为正常工作。请记住,这是一个网站,而不是桌面应用程序可能是的副本,而不是检测到用户离开网站,请以正确的方式操作,并在设置的时间段后将其超时*提示:您实际上不必做任何事情来实现这一点!当有人同时在两个选项卡中打开应用程序时,使用tab close会很麻烦(这并不少见),然后决定关闭其中一个。告诉我们您尝试这样做的原因,因为您可能错过了一个标准做法。您可能希望使用会话cookie:当浏览器窗口关闭时,浏览器会自动清除会话cookie。这对于您的用例来说可能已经足够好了,但是您可以在某种程度上检测到这是否是由于表单发布或锚定点击造成的。