メッセージを送信し、多数のメッセージを取得し、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;
}
}