2016-07-26 4 views
2

PHPとラチェットで書かれた小さなshoutboxチャットがあります。 JSで手動でWebソケットのonmessageイベントをトリガー

は、私は現時点で押下する上で起こる通常のJavaScript機能を起動以下のイベント、持っている:

socket.onmessage = function(evt) { 
    var data = JSON.parse(evt.data); 
    addMessage(data.msg); 
}; 

動作しますが、私はメッセージを書きたい「ユーザーが入力しています」ユーザーが入力中でメッセージが実際に送信される前に、私はonmessageイベントを手動で呼び出す必要があると推測しています。

関連JS:

var chat = $('#chatwindow'); 
var msg = $('#messagebox'); 

function addMessage(msg) { 
    chat.append("<p>" + msg + "</p>"); 
} 

msg.keypress(function(event) { 
    if (event.which != 13) { 
     return; 
    } 

    event.preventDefault(); 

    if (msg.val() == "" || !open) { 
     return; 
    } 

    socket.send(JSON.stringify({ 
     msg: msg.val() 
    })); 

    addMessage(msg.val()); 
    msg.val(""); 

}); 

socket.onmessage = function(evt) { 
    var data = JSON.parse(evt.data); 
    addMessage(data.msg); 
}; 

答えて

0

あなたは、サーバーから渡されるevt.dataを持っています。別のタイプのイベントを追加します。これは、ユーザーが入力したときにトリガーされます。

何かのように:

socket.onmessage = function(evt) { 
    var data = JSON.parse(evt.data); 
    if (data.type == 'message') { 
     addMessage(data.msg); 
    } else if (data.type == 'typing') { 
     showUserIsTyping(); 
    } else if (data.type == 'typingStopped') { 
     hideUserIsTyping(); 
    } 
}; 

あなたがする必要があるだろうすべては、サーバーwhen the user is typingにメッセージを送信し、多分タイムアウトを追加し、ユーザーが何を入力していない場合typingStoppedのイベントを送信しています10秒ほどのように。ここで

は、あなたが提供されたコードの使用例である:

var msg = $('#messagebox'); 

function addMessage(msg) { 
    chat.append("<p>" + msg + "</p>"); 
} 

msg.keypress(function(event) { 
    event.preventDefault(); 

    if (msg.val() == "" || !open) { 
     return; 
    } 

    //User pressed enter 
    if (event.which == 13) { 
     socket.send(JSON.stringify({ 
      type: 'message' 
      msg: msg.val() 
     })); 
     addMessage(msg.val()); 
     msg.val(""); 
    } else { 
     //Keypress, but not enter 
     socket.send(JSON.stringify({ 
      type: 'typing' 
     })); 
    } 
}); 

socket.onmessage = function(evt) { 
    var data = JSON.parse(evt.data); 

    switch (data.type) 
    { 
     case 'message': 
      addMessage(data.msg); 
      break; 
     case 'typing': 
      notifyUserTyping(); //Create this function, and have it show/hide a "Typing..." textbox or similar. 
      break; 
    } 
}; 
+0

をしかし、どのように私は自分のイベントを追加しますか? onmessageは、メッセージがすでに送信されたときに発生します。 – user6562256

+0

'onmessage'イベントは、あなたのコードのどこかで呼び出すために発生します(ユーザがenterを押したときに言いました)。それはあなたが他の場所でそれを送ることができないことを意味しません(誰かが入力しているときのように)。あなたはデータを変更することができますので、イベントをキーとして渡すだけです(つまり、socket.sendMessage({event: 'message'、msg: 'テスト'});)、それを解析することができます他のクライアントに – FrankerZ

+0

要約すると:複数のメッセージをサーバーに送信する: '{type: 'message'、msg: 'testing'}'、ユーザーがエンターを押したとき。ユーザーが入力を開始するときに '{type: 'typing'}'を送信します。タイムアウト期間の後に '{type: 'typingStopped'}'を送信して、他のユーザに、もはや停止していないことを通知します。どのタイプのイベントが起こったのか(メッセージ、タイプ、またはタイピングされたもの)を把握し、ハンドラを適切に起動するには、他のクライアントで 'type'を解析します。 – FrankerZ

関連する問題