Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何停止';正在键入';用户发送消息时的函数_Javascript_Jquery_Node.js_Sockets_Socket.io - Fatal编程技术网

Javascript 如何停止';正在键入';用户发送消息时的函数

Javascript 如何停止';正在键入';用户发送消息时的函数,javascript,jquery,node.js,sockets,socket.io,Javascript,Jquery,Node.js,Sockets,Socket.io,当用户点击enter键时,我的“用户正在键入”功能不会删除“正在键入”。因此,即使用户发送消息,“正在键入”仍会显示,直到计时器用完 有什么想法吗 这是我的代码: 客户端 // Detect typing function timeoutFunction() { typing = false; socket.emit("typing", false); socket.emit("notTyping", true) }

当用户点击enter键时,我的“用户正在键入”功能不会删除“正在键入”。因此,即使用户发送消息,“正在键入”仍会显示,直到计时器用完

有什么想法吗

这是我的代码:

客户端

// Detect typing

      function timeoutFunction() {  
        typing = false;
        socket.emit("typing", false);
        socket.emit("notTyping", true)
      }

      $("#msg").keypress(function(e){
        if (e.which !== 13) {
          if (typing === false && $("#msg").is(":focus")) {
          typing = true;
          socket.emit("typing", true);
          } else {
              clearTimeout(timeout);
              timeout = setTimeout(timeoutFunction, 1500);
            }
        }
        else if(e.which == 13 && $("#msg").val() !== "") {
          $("#"+data.person+"").remove();
        }
      });

      socket.on("isTyping", function(data) {  
        if (data.isTyping) {
          if ($("#"+data.person+"").length === 0) {
            socket.emit("checkTypingFunction");
            $("#chat").append("<div id='"+ data.person +"'><span class='grey'>" + data.person + " is typing...</div>");
            timeout = setTimeout(timeoutFunction, 1500);
          }
        } else {
           $("#"+data.person+"").remove();
          }
      });

当用户按Enter键时,您只是错过了这个例子。您需要添加到
if
语句中

$("#msg").keypress(function (e) {
    if (e.which !== 13) {
        typing = true; // we know the user is typing because they have pressed a key but not 'Enter'
        socket.emit("typing", true);
        clearTimeout(timeout);
        timeout = setTimeout(timeoutFunction, 1500);
    } else {
        clearTimeout(timeout); // no need to fire the timeoutFunction twice (as we do it on the next line)
        timeoutFunction(); // probably needs a better name but this will immediately send the necessary `socket.emit('typing', false)` when the enter key is pressed
    }
});

我会保留一个定义的持续时间,如果用户没有键入(
keyup
)那么长的时间,调用已经工作的
“notTyping”
。我需要在用户按enter键(发送消息)时停止该功能。请尝试在用户按enter键时您不处理该案例。这仍然不考虑“按enter键”。请在我的问题中查看我发布的代码。我在一段时间
clearTimeout(timeout)后删除'is typing'没有问题
在这两种情况下都存在,为什么要重复它?@Rayon我添加了一些注释,希望能帮助更好地解释它。您还可以使用类似于:
if(timeout){clearTimeout(timeout)}
的语句将其完全置于
if
语句之外。这可能会超出
if
块,并且它的工作原理相同。请查看我问题中更新的代码。Enter的代码不正确work@JonasSH您仍然没有将事件发送到服务器。按键功能在其范围内是否有
数据
?我对这段代码的工作原理感到困惑。问题是用户仍然在输入,房间里的其他人看到了用户仍然在输入的消息,还是两者都有?抱歉,sockets和node.js对我来说是全新的。我需要它像这样工作:1。$(“#msg”).keypress(函数(e){}将事件发送到服务器(“键入”).2.服务器“键入”将事件发送到客户端的“isTyping”。所有这些工作都非常好。但我不知道如何以及在何处添加代码,这将考虑到“点击”Enter
$("#msg").keypress(function (e) {
    if (e.which !== 13) {
        typing = true; // we know the user is typing because they have pressed a key but not 'Enter'
        socket.emit("typing", true);
        clearTimeout(timeout);
        timeout = setTimeout(timeoutFunction, 1500);
    } else {
        clearTimeout(timeout); // no need to fire the timeoutFunction twice (as we do it on the next line)
        timeoutFunction(); // probably needs a better name but this will immediately send the necessary `socket.emit('typing', false)` when the enter key is pressed
    }
});