programing

채팅에서 "사용자가 입력 중" 기능

oldcodes 2023. 8. 17. 21:51
반응형

채팅에서 "사용자가 입력 중" 기능

저는 채팅에 "사용자가 타이핑하고 있다" 기능을 추가하려고 합니다. 즉, PHP + MySQL/Ajax로 작성된 채팅입니다.

작동 방식:

-제 채팅 파트너 X가 입력을 시작하면 채팅 상자에 "X는 입력 중입니다."라는 메시지가 나타납니다.

-내가 (Y라는 이름을 가진) 입력할 때 그는 그의 채팅 상자에서 "Y는 입력 중입니다"(Yahoo Messenger와 마찬가지로)를 봅니다.

내가 지금까지 시도한 코드:

<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>

질문:

  1. 내 철자에 대해 생각하기 위해 몇 초 동안 멈추면 타이핑이 중단된 것처럼 보입니다.이 기능을 설정하는 데 더 적절하고 덜 복잡한 방법이 있습니까?가능한 코드는 다음과 같습니다.

    • 텍스트 상자가 비어 있지 않음(사용자가 아무 키나 눌러 입력하기 시작함) -> 메시지:사용자가 입력 중입니다.
    • 빈 텍스트 상자 -> 메시지:사용자가 입력하지 않습니다.
    • 텍스트 상자가 비어 있지 않지만 사용자가 5초 이상 아무 키도 누르지 않았습니다. -> 메시지:사용자가 입력하지 않습니다.
  2. 이것은 제가 타자를 치고 있다는 것을 스스로에게 보여줍니다. 제가 어떻게 그것을 구현할 수 있는지 또는 어디에서 제 채팅 상자에서 "X 사용자가 타자 중입니다"가 아니라 "X 사용자가 타자 중입니다"를 볼 수 있는지를 보여줍니다.다른 사용자도 마찬가지로 자신에 대한 메시지가 아니라 제가 타이핑을 하고/안하고 있다는 메시지를 받아야 합니다.

감사해요.

당신에게 도움이 될 수 있는 바이올린을 만들었습니다.자바스크립트를 사용하여 활동 메시지를 새로 고치는 것입니다.setInterval기능.

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

언더스코어.js라는 강력한 라이브러리 플러그인이 있습니다.

많은 유용한 함수 중에는 _.debounce라는 함수가 있는데, 이 함수는 타이핑을 추적하는 데 이렇게 사용할 수 있습니다.

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

텍스트 영역 입력 시 Started를 호출하고 typing을 true로 설정하여 다시 호출할 수 없도록 합니다.그러면 stopped를 입력하면 호출되지만 _.debounce의 두 번째 인수로 지정된 5000ms 이후에 _.debounce에 랩된 함수만 호출됩니다.그러나 typing stopped를 다시 호출하면 카운트다운이 원래 있던 위치에서 다시 5000ms로 재설정됩니다.typingStopped는 각 입력에 대해 호출되므로 키를 누르는 사이에 5초가 지나면 typing= false만 실행됩니다.

var isTyping = false;
var isNotTyping;
  document.getElementById('chat-message-input').onkeypress = () => {
  sendIsTypingToUser()
  if (isNotTyping != undefined) clearTimeout(isNotTyping);
  isNotTyping = setTimeout(sendIsNotTyping, 900);
  };

  function sendIsTypingToUser(){
     if(!isTyping){
        console.log("IsTyping...........")
        isTyping = true
        }
     }
  function sendIsNotTyping(){
     console.log("Not Typing...........")
     isTyping = false
     }
<input id="chat-message-input" type="text" placeholder="Enter Message..." autofocus style="width: 50%; padding: 8px;">

HTML 대신 JQuery를 사용하여 키프레스 이벤트를 처리할 수 있습니다. 이런 방법을 시도해 볼 수 있습니다.그런 다음 기본 #typing on div를 User is not typing으로 설정합니다.

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

언급URL : https://stackoverflow.com/questions/8963810/user-is-typing-function-in-chat

반응형