0

我正在编写一个基于 websocket 的页面,它应该发送一条消息,然后获取一堆消息,更新 UI 并等待下一个用户操作。

然而,似乎每条传入的消息(即页面上的多个 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