断开连接时更新客户端中的用户列表
Updating user list in client upon disconnection
大家好。在SO中解决我的问题后。我在 socket.io 的数组users[]
中成功添加了user
,并在客户端显示了连接的users
。
用户断开连接后,将使用此代码删除用户名delete users[socket.user];
但用户名仍保留在客户端中。
你能帮我删除用户的名字吗?谢谢。
这是我的服务器.js
var redis = require('redis');
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(8080);
var users = [];
app.get('/', function (req, res) {
res.sendfile(__dirname + '/test.html');
});
io.sockets.on('connection', function (socket) {
socket.on('adduser', function (user) {
socket.user = user;
users.push(user);
updateClients();
});
socket.on('disconnect', function () {
delete users[socket.user];
updateClients();
});
function updateClients() {
io.sockets.emit('update', users);
}
});
这是我的客户.html。
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
var userList = [];
socket.on('connect', function (){
socket.emit('adduser', prompt("What's your name?"));
});
socket.on('update', function (users){
userList = users;
$('#user').empty();
for(var i=0; i<userList.length; i++) {
$('#user').append("<b>" + userList[i] + "</b></br>");
}
});
</script>
<div style="float:left;width:100px;border-right:1px solid black;height:300px;padding:10px;overflow:scroll-y;">
<b>Users</b>
<div id="users">
<p id="user"></p>
</div>
</div>
我不知道在socket.on('disconnect', function() {});
中放入什么,因此断开连接的用户和用户名将在客户端中删除。
客户端未
正确更新客户端的原因是您没有删除正确的服务器端。不能使用 delete
删除数组键的内容。相反,请执行此操作:
socket.on('disconnect', function() {
users.splice(users.indexOf(socket.user), 1);
updateClients();
});
你正在做的事情的问题在于你实际上是在这样做:
var users = [];
users.push('foo');
delete users['foo'];
由于arr
是一个数组,users['foo']
将映射到未定义。字符串foo
实际上是数组的索引之一,因此您必须使用 delete users[0]
,这将导致数组键仍然存在但未定义:
users[0] // undefined
相反,您应该完全删除密钥:
var index = users.indexOf(socket.user);
users.splice(index, 1);
无法按内容访问数组项。编写一个函数以遍历users
数组以将其删除。
function removeUser(username){
var users2 = [];
users.forEach(function(user){
if(user === username){ return;} // do nothing this iteration
users2.push(user); // if we haven't returned yet, add to users2
});
users = users2;
return users2;
};
socket.on('disconnect', function() {
removeUser(socket.user);
updateClients();
});
相关文章:
- 如何在用户返回和上一个按钮时刷新下拉列表
- 根据用户从下拉列表中的选择显示多个文本框
- 谷歌表单-根据分配给谷歌应用程序的工作为商业用户预先填充多项选择列表
- 如何在javascript中获取facebook用户喜欢的页面名称、类别列表
- 如何强制用户从下拉列表和按钮中选择一个值以启用保存按钮
- 如何使用护照循环用户.js并将用户列表打印到 DOM 上
- 断开连接时更新客户端中的用户列表
- 如何加载用户列表并并行呈现它们
- XEP-0133:管理员请求获取所有在线用户列表
- 生成联机用户列表
- 在JavaScript/jQuery中管理用户列表的最佳方法是什么
- 循环浏览Google Calendar用户列表
- 在AngularJS中,当ng-repeat下的用户列表中的一个复选框被选中时,显示一个删除按钮的简单方法
- 在knockout中迭代用户列表并将其压入数组
- 如何检索用户列表从mysql在javascript
- 从PHP创建JavaScript对象来保存带有用户数据字段的用户列表
- 使用easyrtc的房间占用侦听器,如何在用户列表更新后立即调用其他用户
- 如何使用' meteorJs '编辑用户列表
- 使用Javascript与ejabberd一起获取在线用户列表
- 获得完整的用户列表