我如何检测用户何时离开我的网站,而不仅仅是去到另一个页面
How can I detect when the user is leaving my site, not just going to a different page?
我有一个onbeforeunload处理程序
window.onbeforeunload = unloadMess;
function unloadMess(){
var conf = confirm("Wait! Before you go, please share your stories or experiences on the message forum.");
if(conf){
window.location.href = "http://www.domain.com/message-forum";
}
}
但是我不确定如何知道他们点击的url是否在网站内。
我只是想提醒他们,如果他们要离开网站。
这是不可能做到100%可靠的,但如果你检测到用户点击了页面上的链接,你可以使用它作为一个基本正确的信号。像这样:
window.localLinkClicked = false;
$("a").live("click", function() {
var url = $(this).attr("href");
// check if the link is relative or to your domain
if (! /^https?:'/'/./.test(url) || /https?:'/'/yourdomain'.com/.test(url)) {
window.localLinkClicked = true;
}
});
window.onbeforeunload = function() {
if (window.localLinkClicked) {
// do stuff
} else {
// don't
}
}
我有一个想法,但我不知道它是否工作。我的建议是,为每个链接添加一个带有函数调用的onClick事件。该函数只读取href属性并将其存储到具有全局作用域的变量中。
var clickedHrefAttrValue = "";
function getClickUrl(currentLink)
{
clickedHrefAttrValue = $(currentLink).attr("href");
return true;
}
a标签的html必须如下所示:
<a href="<url>" onClick="getClickUrl(this)">Linktext</a>
和给定函数中的
function getClickUrl()
{
if (clickedHrefAttrValue.indexOf("<your condition>" > -1)
{
//what ever you want do to
}
}
这只是一个想法,但我认为值得一试。
如果你有问题,因为你的网站可能有绝对和相对的本地链接,我有另一个解决方案(使用jQuery):
演示/* EXTERNAL LINK WARNING
=========================================*/
$('a').on('click', function(e){
e.preventDefault();
var url = $(this).attr('href'),
host = location.host;
if (url.indexOf(host) > -1 || url.indexOf('http','https') == -1){
/* If we find the host name within the URL,
OR if we do not find http or https,
meaning it is a relative internal link
*/
window.location.href = url;
} else {
var warn = confirm('You''re leaving the domain.'n'nAre you sure?');
if(warn == true) {
window.location.href = url,'_blank';
} else {
e.preventDefault;
}
}
});
所以我需要这样做,这样如果用户从任何页面离开网站,我就可以注销用户,但如果他们在网站内导航,则不行。以下是我使用JS和PHP的解决方案
在他们需要保持登录的每个页面上,设置一个会话变量:
<?php
session_start();
$_SESSION["isInSession"] = true;
?>
现在创建两个脚本:
clear-in-session.php
<?php
session_start();
unset($_SESSION["isInSession"]);
?>
logout.php
<?php
session_start();
if(isset($_SESSION["isInSession"]) exit();
//do logout code here
?>
现在我们在JS中设置两个事件:
window.addEventListener('beforeunload', function(event) {
$.ajax({
type: 'POST',
async: false,
url: 'clear-in-session.php'
});
});
window.addEventListener('unload', function(event) {
$.ajax({
type: 'POST',
async: false,
url: 'logout.php'
});
});
当用户导航到同一站点的另一个页面时,解释事件的顺序:
- 用户导航离开
- beforeunload被触发,调用clear-in-session.php删除isInSession变量
- 加载新页面,将isInSession设置为true
- unload被触发,调用logout.php,但是因为isInSession被设置为true,注销代码永远不会被调用
当用户导航到站点外的页面时(或站点上没有设置isInSession的任何页面):
- 用户导航离开
- beforeunload被触发,调用clear-in-session.php删除isInSession变量
- 新页面已加载
- unload被触发,调用logout.php, isInSession已被删除,因此注销代码调用
抱歉necro,但这个线程仍然出现在搜索这个问题的答案
注意:这个答案使用jQuery来post调用php。在纯JS中完全可以做到这一点,但是用jQuery
我最近在我的网站上实现了一个很好的解决方案。想象一下,你网站上导航用户的所有东西要么是链接(锚标签),要么是按钮,要么是可点击的图像,或者是这些线上的东西。它肯定不是body元素。
现在,当用户离开网站时,他/她可以输入url并按回车键,点击书签或按后退/前进按钮。
当用户这样做时,执行以下操作:
$(window).on('beforeunload', function(e)){
if(e.target.activeElement.nodeName.toLowerCase() == 'body'){
yourFunction();
});
在这些情况下(当用户离开网站时),正文会成为目标中的活动元素,而当用户点击网站内部可导航元素时,情况就不是这样了。
这是一个干净、简单的解决方案。如果你有任何问题,请告诉我。
- Ajax聊天消息重复而不仅仅是更新
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 事件为所有项目而不仅仅是当前项目激发
- 在加载时显示,而不仅仅是在选中时显示
- 删除 HttpCookie 不仅仅是它的值
- 脚本选择所有输入,而不仅仅是复选框
- for 循环中的 if 语句都执行,而不仅仅是一个
- 当将函数传递给方法时,为什么使用匿名函数容器而不仅仅是原始函数有效
- .slideup()删除整个ul,而不仅仅是嵌套的li
- jQuery隐藏所有trs或td,而不仅仅是一个
- 使用Maven压缩所有内容,而不仅仅是源目录
- 从数组中删除双值,而不仅仅是javascript中的重复值
- 在全球范围内强制ng严格di,而不仅仅是在ng应用程序级别上
- Jquery Slider-获取滑块的每个数值?不仅仅是在mouseout上
- 我如何让jQuery在Facebook发布自动加载时做一些事情,而不仅仅是在页面加载时
- 如何使元素的宽度和高度为页面(文档)的100%,而不仅仅是窗口(浏览器)
- 在 Magnific 弹出窗口中打开所有图像,而不仅仅是发布图像
- 有没有办法使非html5支持浏览器支持html5,而不仅仅是html5标记,html5 api也是如此
- 之前每个测试都会调用每个测试,而不仅仅是一次
- 我如何检测用户何时离开我的网站,而不仅仅是去到另一个页面