2017-04-21 7 views
2

Meine Funktion "Benutzer tippt" entfernt nicht die "Eingabe", wenn der Benutzer die Eingabetaste drückt. Auch wenn ein Benutzer die Nachricht sendet, wird die Meldung "Wird getippt" weiterhin angezeigt, bis der Timer abgelaufen ist.Wie man die Funktion "Wird eintippen" stoppt, wenn der Benutzer eine Nachricht sendet

Irgendwelche Ideen?

Dies ist mein Code:

clientseitige

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

serverseitige:

client.on("typing", function(data) { 
    if (typeof people[client.id] !== "undefined") 
    socket.sockets.in(client.room).emit("isTyping", {isTyping: data, person: people[client.id].name}); 
    client.broadcast.to(client.room).emit("isTyping", {isTyping: data, person: people[client.id].name}); 
console.log("Someone is typing"); 
}); 
+0

würde ich einen befristeten Zeitraum halten, wenn der Benutzer nicht für so viel Zeit ('keyup') eingeben, rufen Sie' „notTyping“ ' – Rayon

+0

, das bereits funktioniert. Ich brauche die Funktion zu stoppen, wenn der Benutzer eingibt (sendet die Nachricht) – JonasSH

+0

Versuchen Sie https://jsfiddle.net/rayon_1990/8ps2wcur/1/ – Rayon

Antwort

3

Sie sind einfach nur der Fall fehlt, wenn der Benutzer die Enter-Taste trifft. Sie müssen zu Ihrer if Aussage hinzufügen.

$("#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 
    } 
}); 
+0

'clearTimeout (Timeout);' ist in beiden Bedingungen vorhanden, warum es zu wiederholen? – Rayon

+0

@Rayon Ich habe einige Kommentare hinzugefügt, die hoffentlich helfen, es ein wenig besser zu erklären. Sie können dies auch komplett außerhalb der 'if'-Anweisung mit etwas wie: 'if (timeout) {clearTimeout (timeout)}' bringen. Dies könnte über den "if" -Block hinausgehen und es würde genauso funktionieren. –

+0

Überprüfen Sie den aktualisierten Code in meiner Frage. Der Code für die Eingabe funktioniert nicht. – JonasSH

Verwandte Themen