Socket.io, how to check if a user is printing and transfer it to other users

I am trying to configure the socket.io chat server. I received it for sending and receiving messages from the server and client. I was interested in showing users if someone is typing. I know that I can emit when someone prints from the client to the server, I can also transfer it to other users. But will it effectively do this on every keyboard? How can I deal with this situation? Below is my code:

$("#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 server side:

 socket.on('is typing', function(data){ socket.broadcast.emit('typing', {nickname: data.nickname}); }); 
+4
source share
3 answers

You can use timeouts to send “started typing” and “stopped typing” messages, for example:

 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); } } 

This is rude, but you should get this idea.

+16
source
  function typingtimeoutFunction (){ socket.emit('typingMessage', 'stopped typing'); }, onKeyDownNotEnter: function (){ clearTimeout(this.typingtimeout); socket.emit('typingMessage', 'istyping'); this.typingtimeout = setTimeout(function() {ajaxChat.typingtimeoutFunction();}, 5000); }, 
0
source

I just thought that I would add my own version to a very useful answer given by abject_error. This allows you to print and print, but a message is entered. I do not use socket.io, but you get the idea.

 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 a separate function on keyup that looks for enter being pressed and sends the message } else { e.preventDefault(); } }); }); 
0
source

Source: https://habr.com/ru/post/1482883/


All Articles