Javascript 卸载时发送SocketIO消息或卸载前确认时发送SocketIO消息
我有一个服务器应用程序,通过无线电在远程设备上执行固件更新 有时更新可能会像永远一样继续(如果无线电网络中存在干扰)。在这种情况下,用户可能希望通过刷新或离开页面来中断更新。在这种情况下,我必须:Javascript 卸载时发送SocketIO消息或卸载前确认时发送SocketIO消息,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一个服务器应用程序,通过无线电在远程设备上执行固件更新 有时更新可能会像永远一样继续(如果无线电网络中存在干扰)。在这种情况下,用户可能希望通过刷新或离开页面来中断更新。在这种情况下,我必须: 提醒用户他将要中断更新(不建议这样做),如果用户确定他的决定(并确认): 向服务器发送socketIO事件,通知应取消更新 我通过互联网搜索,找到了不同的解决方案。最好的方法是为全局对象事件onbeforeuload和onunload分配处理程序 使用onbeforeuload我别无选择。只有用户确
onbeforeuload
和onunload
分配处理程序
- 使用
我别无选择。只有用户确认后才能发送SocketIO消息,如果用户决定等待更新完成,则不执行任何操作。我可以将SocketIO消息发送到服务器,但是如果用户决定等待怎么办?伤害已经造成了onbeforeuload
- 使用onload上的
——这似乎对我不起作用。我看到浏览器正在发送套接字事件,但在服务器处理之前,连接已关闭onunload
var custom_id = 0;
io.engine.generateId = (req) => {
let id = custom_id++;
return id++; // very basic but unique id
}
服务器:创建尝试关闭事件的侦听器,并存储用户id尝试:
var userAttempt = 0;
socket.on('attempt to close', function(data){
userAttempt = socket.id;
console.log(data)
})
服务器:修改断开连接事件以检查断开连接的id用户:
socket.on('disconnect', function(){
if(userAttempt === socket.id){
console.log("user attempt and close");
//the update should be canceled !!!!
}
console.log('user disconnected');
});
客户端:创建事件发射器尝试在onbeforeunload
内部关闭,如果用户尝试关闭或重新加载页面,将始终触发此事件
window.onbeforeunload = function (e) {
e.returnValue = " ";
var socket = io();
socket.emit('attempt to close', "user attempt to close");
};
如果用户尝试关闭选项卡,我们将触发事件尝试关闭,我们将检查用户是否关闭选项卡并检查断开连接事件。如果用户断开连接与用户试图关闭的相同,则应取消更新。我所做的是将套接字事件放入
window.addEventListener('unload',函数(e){})代码>
它很好地完成了任务
window.addEventListener('beforeunload', function (e) {
e.preventDefault();
e.returnValue = ' ';
});
window.addEventListener('unload', function (e) {
socket.emit('some event', {data to be sent});
});