0

メッセージを送信し、多数のメッセージを取得し、UI を更新し、次のユーザー アクションを待つことになっている websocket ベースのページを作成しています。

ただし、すべての着信メッセージ (つまり、ページ上の複数の onmessage) は、前のメッセージが行ったことを取り消すように見えますが、これは私が望んでいることではありません。

アラートを追加しましたが、send() の受信ごとに、$document.ready() と websocket.onload の両方が呼び出されるようです (ただし、同じ送信への複数のメッセージでは実行されません)。それを防ぐ方法はありますか、またはローカルデータ構造を維持する必要がありますか? それとも、各メッセージでデータ本体全体を送信する必要がありますか?

<script language="javascript" type="text/javascript">
<!--
var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket;
var wsUri = "ws://localhost:9000/nodeWS";

window.addEventListener("load", init, false);

function init() {
  alert("init")
  $("#addNodeForm").submit(function(evt){
    addNode();
  }); 
  testWebSocket();
}

function testWebSocket() {
  /*var createSocket = new WS("@routes.Nodes.watchNodeCollection");*/
  if ('WebSocket' in window) {
    try{
      websocket = new WebSocket(wsUri);
  /*      alert("WebSocket created");*/
    } catch (e) {
      alert("exception creating WebSocket: " + e);
    }
  }
  else if ('MozWebSocket' in window) {
    try{
      websocket = new MozWebSocket(wsUri);
  /*      alert("MozWebSocket created");*/
    } catch (e) {
      alert("exception creating MozWebSocket: " + e);
    }
  }
  else {

    alert("no websocket support found");
  }   
  /*  alert("websocket created");*/
    websocket.onopen = function(evt) {
      alert("onopen")
      getAllNodes();
    };
    websocket.onclose = function(evt) { 
      onClose(evt);
      alert("onClose ended");
    };
  websocket.onmessage = receive
}

var receive = function onMessage(evt) { 
  evt.stopPropagation()
  evt.preventDefault()
  var data = JSON.parse(evt.data);

  if (data.error){   document.getElementById("messageBox").removeClass().addClass("errorbox").innerHTML(data.error).fadeIn(2000).fadeOut(4000);
  } 
  if (data.message){
document.getElementById("messageBox").removeClass().addClass("confirmbox").innerHTML(data.message)/*.fadeIn(2000).fadeOut(4000);
  }
  if (data._id) { 
      addNodeRowToTable(data.doc);
  }
}
function addNodeRowToTable(data){
...add node to table...
}

function addNode() {
  var address = document.getElementById("address")

  websocket.send(JSON.stringify({
    type : "addNode",
    address : address.value.length>0 ? address.value : null
  }))      
}

function getAllNodes(){
  websocket.send(JSON.stringify(
      {
      type : "getAllNode"
    }
    )) 
}


var handleReturnKey = function(e) {
  if(e.charCode == 13 || e.keyCode == 13) {
    e.preventDefault()
    addNode()
    return false;
  }
}
4

0 に答える 0