默认情况下,当浏览器关闭时,PHP 发送的所有会话 cookie 都会被删除。但据我所知,您想在其他浏览器上显示通知。这有点难,而且不太好。你必须使用关闭窗口 https://developer.mozilla.org/en/DOM/window.onclose事件处理程序并向服务器发出 Ajax 请求(我相信它应该是同步请求)以发出窗口关闭信号。而且同步调用并不是那么好......
另一方面,另一个浏览器必须通过其他 Ajax 请求拉取服务器才能查看某个用户何时注销。
所有这些 Ajax 请求都是一个丑陋的解决方案。
Update:
正如 Thorarin 和 Jonathan Fingland 所说,多个窗口(不是选项卡,因为 window.onclose 在窗口而不是选项卡上触发)可能会出现问题,但我相信这个问题也有解决方案。如果第一个窗口设置了cookienumber_of_windows
= 1,每个打开的窗口都会递增,然后在窗口关闭时,仅当满足以下条件时才会触发 Ajax 请求number_of_windows
等于1,否则只是递减number_of_windows
.
更新2:
事实上,上述解决方案在打开多个选项卡时会遇到问题。我正在考虑如何缓解这种情况。
更新3:
好的,我找到了某种解决方案,但它在 IE6 中不起作用,不知道其他 IE 版本是否有效。下面的代码片段跟踪打开的窗口和选项卡的数量(IE 除外,它不会在窗口之间实时更新 document.cookie,但我相信它可以通过一些 IE 专有功能来解决)。然后在每个页面卸载时,这意味着即使在同一网站上从一个页面导航到另一个页面,脚本也会检查有多少个打开的窗口。如果它是唯一打开的窗口/选项卡,那么它会发出 Ajax 请求。这是解决方案的第一部分。现在,第二部分。
在服务器端,Ajax 调用请求的脚本应该更新数据库中的某些条目,表明用户may已关闭页面。您如何判断她是否只是访问您网站上的新页面?简单,在每个页面访问中,您检查数据库中该会话的“可能已注销”值,如果有,则将它们标记为 false(用户已登录),否则用户将继续在数据库中注销(true旗帜)。
它很混乱,但这是我想到的唯一解决方案,因为我无法在 JavaScript 中确定页面重新加载等。另外,我没有做广泛的测试,更多的是一个想法。反正,我不会推荐这个解决方案。对每个更改的页面发出 Ajax 请求是多余的,并且在不计算其他浏览器完成的轮询的情况下,实际上会使服务器上的点击量增加一倍。
这是片段。顺便说一下,bakery.js 是 document.cookie 的一个小包装。你可能会发现它的来源在 github 上 http://gist.github.com/124866.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="bakery.js"></script>
<script type="text/javascript">
var logout = function() {
var xhr = new XMLHttpRequest;
xhr.open("GET", "logout.php", false);
xhr.send(null);
};
window.onload = function() {
var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;
IGS.Bakery.setCookie("winNumber", winNumber + 1);
};
window.onunload = function() {
var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;
IGS.Bakery.setCookie("winNumber", winNumber - 1);
if (winNumber === 1) {
logout();
}
};
var showCookies = function() {
alert(IGS.Bakery.getCookie("winNumber"));
};
</script>
</head>
<body>
<a href="#" onclick="showCookies();">show</a>
</body>
</html>
忘记说了。 window.onclose 不是跨浏览器的。