Fonction "l'utilisateur tape" dans le chat

j'essaie d'ajouter dans le chat une fonction "user is typing"; chat écrit en PHP + MySQL/Ajax.

Comment cela devrait fonctionner:

- quand mon partenaire de chat X commence à taper, je vois dans ma boîte de chat: "X tape"

- quand je (y nommé) suis en train de taper il voit dans sa boîte de chat: "Y est en train de taper" (comme Yahoo Messenger).

Le code que j'ai essayé jusqu'à présent:

<script type="text/javascript" language="javascript">
    var timer = 0;

    function reduceTimer() {
        timer = timer - 1;
        isTyping(true);
    }

    function isTyping(val) {
        if (val == 'true') {
            document.getElementById('typing_on').innerHTML = "User is typing...";
        } else {

            if (timer <= 0) {
                document.getElementById('typing_on').innerHTML = "No one is typing -blank space.";
            } else {
                setTimeout("reduceTimer();", 500);
            }
        }
    }
</script>

<label>
    <textarea onkeypress="isTyping('true'); timer=5;" onkeyup="isTyping('false')" name="textarea" id="textarea" cols="45" rows="5"></textarea>
</label>
<div id="typing_on">No one is typing -blank speace.</div>

Questions:

  1. si je m'arrête quelques secondes pour penser au sujet de mon orthographe on dirait que j'ai arrêté de taper. Est-il plus pertinent et moins compliqué pour définir cette fonction? Est-il possible qu'un code par:

    • zone de texte non vide (l'Utilisateur a appuyé sur n'importe quelle touche pour commencer à taper) -> Message: L'utilisateur tape.
    • zone de texte vide -> Message: L'utilisateur ne tape pas.
    • zone de texte n'est pas vide, mais l'utilisateur n'a pas appuyé sur aucune touche pendant plus de 5 secondes -> Message: l'Utilisateur n'est pas taper.
  2. Il me montre à moi-même que je suis en train de taper; Comment pourrais-je l'implémenter ou où, pour voir dans ma boîte de chat "l'utilisateur x tape" et non "moi-même tape". Pareil pour l'autre utilisateur, il devrait recevoir un message sur moi tapant/ne tapant pas , pas sur lui-même.

je vous Remercie.

15
demandé sur technophyle 2012-01-22 23:12:38

4 réponses

j'ai créé un tripoter cela pourrait vous être utile. L'idée est de rafraîchir le message d'activité en utilisant javascript setInterval fonction.

var textarea = $('#textarea');
var typingStatus = $('#typing_on');
var lastTypedTime = new Date(0); // it's 01/01/1970, actually some time in the past
var typingDelayMillis = 5000; // how long user can "think about his spelling" before we show "No one is typing -blank space." message

function refreshTypingStatus() {
    if (!textarea.is(':focus') || textarea.val() == '' || new Date().getTime() - lastTypedTime.getTime() > typingDelayMillis) {
        typingStatus.html('No one is typing -blank space.');
    } else {
        typingStatus.html('User is typing...');
    }
}
function updateLastTypedTime() {
    lastTypedTime = new Date();
}

setInterval(refreshTypingStatus, 100);
textarea.keypress(updateLastTypedTime);
textarea.blur(refreshTypingStatus);
11
répondu Raman Chodźka 2013-04-24 14:07:46
     <script>
        function isTyping() {
                document.getElementById('typing_on').innerHTML = "User is typing...! "; }

        function  notTyping (){
       document.getElementById('typing_on').innerHTML = "No one is typing ! "; }
    </script>

    <label>
        <textarea onkeypress="setTimeout(isTyping(),4000); setInterval(notTyping,5000)"  name="textarea" id="textarea" cols="45" rows="5"></textarea>
    </label>
    <div id="typing_on">No one is typing -blank speace.</div> 





    <!DOCTYPE html>
    <html>
       <head>
       </head>
       <body>

      <script>
        function isTyping() {
                document.getElementById('typing_on').innerHTML = "User is typing...! "; }
            
        function  notTyping (){
       document.getElementById('typing_on').innerHTML = "No one is typing ! "; }
    </script>

    <label>
        <textarea onkeypress="setTimeout(isTyping(),4000); setInterval(notTyping,5000)"  name="textarea" id="textarea" cols="45" rows="5"></textarea>
    </label>
    <div id="typing_on">No one is typing -blank speace.</div> 
       </body>
    </html>
2
répondu Sivananda Mandapati 2017-02-25 14:24:20

Vous pouvez utiliser JQuery pour gérer l'événement keypress au lieu de HTML. Vous pourriez essayer quelque chose comme ça. Ensuite, définissez votre #typing par défaut sur div car L'utilisateur n'est pas en train de taper.

//EXECUTES WHEN KEY IS PRESSED IN SPECIFIED ELEMENT
$("#textarea").keypress(function(){
numMiliseconds = 500;

//THIS IF STATEMENT EXECUTES IF USER CTRL-A DELETES THE TEXT BOX
if ($("textarea") == ""){
    $("#typing_on").text("User has cleared the text box");
}

$("#typing_on").text("User is typing").delay(numMiliseconds).queue(function(){
    $("#typing_on").text("User has stopped typing");
    }
});
1
répondu MikeyObviously 2012-05-09 05:03:22

Theres une chouette bibliothèque de plug-in appelé trait de soulignement.js

parmi ses nombreuses fonctions utiles, il y en a une qui s'appelle _.anti-rebond, qui peut être utilisé comme afin de suivre en tapant:

var typing, typingStarted, typingStopped;

typing = false;

typingStopped = _.debounce((function() {
  if (!typing) {
    return;
  }
  typing = false;
  console.log('typing is done so do what ever you need to do to notify it');
}), 5000);

typingStarted = function() {
  if (this.typing) {
    return;
  }
  typing = true;
  console.log('typing has started so do what ever you need to do to notify it');
};

document.querySelector("textarea").oninput = function(event) {
  typingStarted();
  typingStopped();
  return
};

la façon dont cela fonctionne est que sur l'entrée de la zone de texte typingStarted est appelé et définit la dactylographie à true l'empêchant d'être appelé à nouveau. typingStopped est alors appelé, mais n'invoquera que la fonction enveloppée dans le _.anti-rebond après 5000 ms, qui est donné comme le deuxième argument à _.anti-rebond. Cependant, si vous appelez à nouveau tapingstopped, il réinitialisera le compte à rebours à 5000 ms à partir de l'endroit où il était. Puisque typingStopped est appelé sur chaque entrée, il n'exécutera jamais typing = false qu'après 5 secondes entre les touches.

0
répondu Nathaniel Turner 2018-01-04 22:45:22