gpt4 book ai didi

javascript - 如何从浏览器向服务器发送消息 "page will close"?

转载 作者:行者123 更新时间:2023-11-29 18:04:39 25 4
gpt4 key购买 nike

我想向每个 html 文档添加一个脚本 (JavaScript),它向服务器发送两条消息:

  • 页面确实打开了
  • 页面将关闭(此消息包含页面打开的时间)

应该在文档加载时(或完成加载时)发送打开消息。这是简单的部分。

当文档从浏览器的视口(viewport)中卸载时,应该发送关闭消息。 (用户点击没有 target="_blank"的链接;用户关闭浏览器选项卡/窗口;用户重新加载页面;用户退出浏览器;任何其他使页面消失的事情)

我这样试过:

//================================================================================
//Global Variables
//================================================================================
gl = {}; //container for global variables (1 scalar and 1 function)
gl.start = Math.floor(Date.now()); //timestamp of page-loading


//================================================================================
//function: Send message to server
//================================================================================
gl.sendData = function (action) {
var message = {
'href' : window.location.href,
'height' : $(window).height(),
'width' : $(window).width(),
'action' : action, //can be 'open' or 'close' (i.e. 'load' and 'unload')
'rand' : Math.random() //random number to outwit cache
};
if (action == 'close') {
//how long was the page open? [milliseconds]
message.duration = Math.floor(Date.now()) - gl.start;
};
window.alert(action); //debugging: show if gl.sendData is executed
$.ajax({
'url' : 'http://' + window.location.hostname + '/path/to/script.pl',
'data' : message,
'success' : function(){}, //not interested in server's answer
'error' : function(){} //errors will be ignored
});
};


//================================================================================
//Things to do as soon as page load is complete
//================================================================================
$(document).ready(function(){

//send message "page did open"
gl.sendData('open');

//add event-handler to send the message "page will close" when the page is closing
$(window).on("unload", function() {
gl.sendData('close');
});
});

当页面打开时发送消息工作得很好。但是浏览器不发送关闭消息。

我发现了这个事实:

  • “卸载”似乎是正确的事件。页面关闭时弹出警报消息。
  • “beforeunload”不起作用,因为它没有被触发(Mac 上的 Safari,当单击导航到另一个页面的链接时)
  • ajax 请求是在页面加载时发送的,所以看起来没问题。
  • 当页面关闭时,ajax 请求不会向服务器发送数据。

我的问题:

有没有办法在文档从浏览器卸载的那一刻向服务器发送消息?
我想将显示的页面持续时间发送到服务器。还有其他方法吗?

最佳答案

没有 100% 可靠的方法可以在页面关闭时将数据发送到服务器,并适用于所有浏览器。

随着浏览器中 webSocket 的出现和普遍可用性,有些人正在使用从客户端到服务器的 webSocket 连接作为对此进行跟踪的方法。当页面打开时,它会与服务器建立 webSocket(或 socket.io)连接。此连接在页面持续期间保持打开状态。当用户离开页面或关闭浏览器时,webSocket 将被浏览器关闭。然后服务器可以看到 webSocket 已经关闭,并可以将其标记为页面关闭的时间。

另一种比 webSocket 连接效率低的可能性是打开的网页通过 Ajax 定期轮询服务器(比如每 30 秒左右宣布页面仍然打开)。当服务器看到轮询停止时,它假定该页面已关闭。

这两种技术都需要与服务器定期连接才能进行此跟踪(例如,不能用于跟踪离线使用情况)。

关于javascript - 如何从浏览器向服务器发送消息 "page will close"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com