2016-05-12 28 views
1

所以大家好。我正在使用NodeJS和SocketIO制作在线用户脚本。它的工作正常,但我的问题是,如果用户从几个浏览器/窗口/设备等连接,它会显示多个结果,如: 48 48 48 61所以我希望48只显示一次,如果他退出只有一个浏览器和其他人仍然连接,然后保持它们。检查一个搜索结果是否存在多于一次,如果是,则只显示一个结果在Javascript中

这里是我的代码: 客户端:

socket.on('userslist',function(users){ 
    var text = ""; 
    var i; 
     for (i = 0; i < users.length; i++) { 
     text += users[i].user_name + "<br>"; 
     document.getElementById("demo").innerHTML = text; 
     } 
    }); 

服务器端:

socket.on('user name',function(user_name){ 
    users.push({id:socket.id,user_name:user_name}); 
    len=users.length; 
    len--; 
    //Sending th user Id and List of users 
    io.emit('user entrance',users,users[len].id); 
    io.emit('userslist',users); 
}); 

我搜查,但一无所获。

回答

0

首先,一个简单的优化代码:

socket.on('userslist',function(users){ 
    var text = ""; 
    var i; 
    for (i = 0; i < users.length; i++) { 
     text += users[i].user_name + "<br>";    
    } 
    document.getElementById("demo").innerHTML = text; //<-- Only needs to happen once 
    }); 

设置innerHTML并不需要在所有的文本进行串联发生的每一个用户,只需一次。

其次,保持走过用户的一个单独的数组保持重复的轨迹:

socket.on('userslist',function(users){ 
    var usersProcessed = []; 
    var text = ""; 
    for (var i = 0; i < users.length; i++) { 
     if(usersProcessed.indexOf(users[i].user_name) < 0){ 
      text += users[i].user_name + "<br>";  
      usersProcessed.push(users[i].user_name); 
     } 
    } 
    document.getElementById("demo").innerHTML = text; 
    }); 

这是在客户端上的例子,但你可以做服务器上的类似的事情,只是取决于你是否需要知道是否有重复。如果没有,最好在服务器上执行以最大限度地减少数据传输。

相关问题