node.js Socket.io 如何检查用户是否正在输入并将其广播给其他用户
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16766488/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Socket.io how to check if user is typing and broadcast it to other users
提问by Yalamber
I am trying to setup socket.io chat server. I have gotten it up to send and receive message from server and client. I was interested in showing users if some one is typing. I know i can emit when some is typing from client to server, I can also broadcast it to other users. But will it be efficient to do that on every keyup? How do i handle such situation? Below is my code for now:
我正在尝试设置 socket.io 聊天服务器。我已经开始从服务器和客户端发送和接收消息。我有兴趣向用户展示是否有人在打字。我知道当某些人从客户端打字到服务器时我可以发出,我也可以将它广播给其他用户。但是在每个键上都这样做会有效吗?我如何处理这种情况?以下是我现在的代码:
$("#textbox").keyup(function (e) {
if (e.keyCode == 13) {
socket.emit('send', {nickname: $('#nickname').val() , msg: $("#textbox").val()});
$('#textbox').val(''); }
else{
socket.emit('is typing', {nickname: $('#nickname').val()});
}
});
and on server side:
在服务器端:
socket.on('is typing', function(data){
socket.broadcast.emit('typing', {nickname: data.nickname});
});
回答by abject_error
You can use timeouts to send "started typing" and "stopped typing" messages, like so:
您可以使用超时来发送“开始输入”和“停止输入”消息,如下所示:
var typing = false;
var timeout = undefined;
function timeoutFunction(){
typing = false;
socket.emit(noLongerTypingMessage);
}
function onKeyDownNotEnter(){
if(typing == false) {
typing = true
socket.emit(typingMessage);
timeout = setTimeout(timeoutFunction, 5000);
} else {
clearTimeout(timeout);
timeout = setTimeout(timeoutFunction, 5000);
}
}
It's rough, but you should get the idea.
这很粗糙,但你应该明白这个想法。
回答by rgbflawed
Just thought I'd add my variation on the very helpful answer given by abject_error. This allows for the status of typing as well as stopped typing but message was entered. I'm not using socket.io but you get the idea.
只是想我会在abject_error给出的非常有用的答案上添加我的变体。这允许输入状态以及停止输入但已输入消息。我没有使用 socket.io 但你明白了。
var typingStatus=0; //0=Not typing: message blank, 1=typing, 2=typing: something there
var typingStatus_timeout = undefined;
//called when timeout kicks in that we've stopped typing
function function_typingStatus_timeout(){
//message entered
if ($('#chat_message').val().trim()) {
typingStatus=2;
//message is blank
} else {
typingStatus=0;
}
//send new status
connection.send(JSON.stringify({
action:'typingStatus',
typingStatus:typingStatus,
}));
}
$(document).ready(function(){
//TYPING
$('#chat_message').keydown(function(e) {
//only record typing if enter not pressed
if(e.which!=13 && e.keyCode!=13) {
//weren't typing before but are now
if (typingStatus!=1) {
//switch to 1 for in progress
typingStatus=1;
//broadcast
connection.send(JSON.stringify({
action:'typingStatus',
typingStatus:typingStatus,
}));
//were typing before and still are, clear the timeout, we're going to reset it in the next step
} else {
clearTimeout(typingStatus_timeout);
}
//either way, set the timeout to trigger after a second of not typing
typingStatus_timeout=setTimeout(function_typingStatus_timeout,1000);
//if enter was pressed we want to not have it register as a keydown at all. there's a separate function on keyup that looks for enter being pressed and sends the message
} else {
e.preventDefault();
}
});
});
回答by Hans Tausend
Just adding my code here following this tutorial: https://www.youtube.com/watch?v=FvArk8-qgCk&index=5&list=PL4cUxeGkcC9i4V-_ZVwLmOusj8YAUhj_9
只需按照本教程在此处添加我的代码:https: //www.youtube.com/watch?v=FvArk8-qgCk&index=5&list=PL4cUxeGkcC9i4V-_ZVwLmOusj8YAUhj_9
// Make connection
var socket = io.connect('http://localhost:4000');
var timeout
// Query DOM
var message = document.getElementById('message'),
handle = document.getElementById('handle'),
btn = document.getElementById('send'),
output = document.getElementById('output'),
feedback = document.getElementById('feedback');
// Emit events
btn.addEventListener('click', function(){
socket.emit('chat', {
message: message.value,
handle: handle.value
});
message.value = "";
});
function timeoutFunction() {
socket.emit("typing", false);
}
message.addEventListener('keyup',function(){
socket.emit('typing', handle.value);
clearTimeout(timeout)
timeout = setTimeout(timeoutFunction, 2000)
})
// Listen for events
socket.on('chat', function(data){
feedback.innerHTML = '';
output.innerHTML += '<p><strong>' + data.handle + ': </strong>' + data.message + '</p>';
});
socket.on('typing', function(data){
if (data) {
feedback.innerHTML = '<p><em>' + data + ' is typing...</em></p>';
} else {
feedback.innerHTML = ''
}
});
Note how it doesn't need the typing boolean variable
注意它是如何不需要输入布尔变量的
回答by ingridsede
function typingtimeoutFunction (){
socket.emit('typingMessage', 'stopped typing');
},
onKeyDownNotEnter: function (){
clearTimeout(this.typingtimeout);
socket.emit('typingMessage', 'istyping');
this.typingtimeout = setTimeout(function() {ajaxChat.typingtimeoutFunction();}, 5000);
},

