检测用户是否离开网页的最佳方法是什么?
在onunload
JavaScript事件不起作用每次(HTTP请求花费的时间比需要的时间终止浏览器)。
创建一个可能会被当前的浏览器阻止。
检测用户是否离开网页的最佳方法是什么?
在onunload
JavaScript事件不起作用每次(HTTP请求花费的时间比需要的时间终止浏览器)。
创建一个可能会被当前的浏览器阻止。
试试这个onbeforeunload
事件:它在页面被卸载之前被触发。它还允许您询问用户是否真的想离开。查看演示onbeforeunload Demo。
或者,您可以在他离开时发送Ajax请求。
Mozilla Developer Network 有一个很好的描述和onbeforeunload示例。
如果您的页面脏了(即,如果用户输入了一些数据),如果您想在离开页面之前警告用户:
window.addEventListener('beforeunload', function(e) {
var myPageIsDirty = ...; //you implement this logic...
if(myPageIsDirty) {
//following two lines will cause the browser to ask the user if they
//want to leave. The text of this dialog is controlled by the browser.
e.preventDefault(); //per the standard
e.returnValue = ''; //required for Chrome
}
//else: user is allowed to leave without a warning dialog
});
这是一个替代解决方案 - 因为在大多数浏览器中,导航控件(导航栏、标签等)位于页面内容区域上方,您可以通过顶部检测鼠标指针离开页面并显示“离开之前”对话。它完全不引人注目,它允许您在用户实际执行离开操作之前与他们进行交互。
$(document).bind("mouseleave", function(e) {
if (e.pageY - $(window).scrollTop() <= 1) {
$('#BeforeYouLeaveDiv').show();
}
});
缺点是,当然这是用户实际打算离开的猜测,但在绝大多数情况下这是正确的。
感谢Service Workers,只要浏览器支持,就可以在客户端实现类似于Adam 的解决方案。只需绕过心跳请求:
// The delay should be longer than the heartbeat by a significant enough amount that there won't be false positives
const liveTimeoutDelay = 10000
let liveTimeout = null
global.self.addEventListener('fetch', event => {
clearTimeout(liveTimeout)
liveTimeout = setTimeout(() => {
console.log('User left page')
// handle page leave
}, liveTimeoutDelay)
// Forward any events except for hearbeat events
if (event.request.url.endsWith('/heartbeat')) {
event.respondWith(
new global.Response('Still here')
)
}
})
我知道这个问题已得到解答,但如果您只想在实际浏览器关闭时触发某些内容,而不仅仅是在页面加载发生时触发,您可以使用以下代码:
window.onbeforeunload = function (e) {
if ((window.event.clientY < 0)) {
//window.localStorage.clear();
//alert("Y coords: " + window.event.clientY)
}
};
在我的示例中,我正在清除本地存储并使用鼠标 y 坐标提醒用户,仅当浏览器关闭时,这将在程序内加载所有页面时被忽略。