Firefox,websockets和奇怪的行为

时间:2013-10-24 23:21:23

标签: java javascript firefox websocket playframework-2.0

背景

  • 使用带有JavaScript + Play的WebSockets!框架(2.2)。
  • 可以在Chrome中发送和接收数据。
  • 只能在Firefox中接收数据(来自服务器),因为send()不会触发任何回调。

除了发送问题,再次在Firefox 之外,页面的标签始终停留在“连接”状态,而微调器一直在旋转(参见图1)。

行为不端的浏览器 Mozilla / 5.0(X11; Ubuntu; Linux x86_64; rv:24.0)( Firefox 24.0

Spinning Snapshot

  

图1 。页面加载并显示数据后的Firefox标签页)


每当我刷新网页时,我都会收到以下错误,归因于我确定的常量页面加载行为。

The connection to ws://localhost:9000/ was interrupted while the page was loading.


整个JavaScript代码:


$(function() {
    var chatSocket = new WebSocket("@routes.Application.getMetaData().webSocketURL(request)");

    var sendMessage = function() {
        chatSocket.send(JSON.stringify({
            id: "unique",
            name: "a name",
            age: 22
        }));
    }

    var receiveEvent = function(event) {
        var data = JSON.parse(event.data)
        document.write(data.age);
        document.write(data.name);
        document.write(data.message);
        document.write("\n");
        sendMessage();
        chatSocket.close();
    }
    chatSocket.onmessage = receiveEvent
})

现在在过去,我一直在尝试MozWebSocket而不是标准的WebSocket,但是我没有在屏幕上使用该模块进行任何渲染,因为除非有一个我错过的角度, WebSocket是最好用的。

相关游戏!块:


public static WebSocket<JsonNode> getMetaData() {
    return new WebSocket<JsonNode>() {

        // Called when the Websocket Handshake is done.
        public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out) {

            // For each event received on the socket,
            in.onMessage(new Callback<JsonNode>() {
                @Override
                public void invoke(JsonNode jsonNode) {
                    System.out.println("Message Incoming!");
                    System.out.println(jsonNode.get("id"));
                    System.out.println(jsonNode.get("name"));
                    System.out.println(jsonNode.get("age"));
                }
            });


            // When the socket is closed.
            in.onClose(new Callback0() {
                public void invoke() {
                    System.out.println("Disconnected");

                }
            });

            ObjectNode node = Json.newObject();
            node.put("message", "hello");
            node.put("name", "client");
            node.put("age", 1);

            out.write(node);

            //same result commented/uncommented
            out.close();
        }
    };
}

因此,在 Chrome 中,流程将为:

  1. 文件撰写(...)
  2. “消息传入!”
  3. ... JSON属性
  4. “断开连接”
  5. 但在 Firefox 中,流程为:

    1. 文件撰写(...)
    2. “断开连接”
    3. 非常感谢任何诊断这些问题的帮助。我无意支持IE,但同时使用Mozilla和Chrome都会很棒。

      其他JavaScript警告:

      下面是一个警告,我偶尔会在Firefox的控制台中看到“ws”协议作为罪魁祸首。它与我的问题有什么关系,我不知道。

      Use of getPreventDefault() is deprecated.  Use defaultPrevented instead.
      

1 个答案:

答案 0 :(得分:3)

您在加载文档后调用document.write(),然后implies document.open()反过来替换文档,然后卸载旧文档并中止诸如超时或websockets之类的内容。

使用document.write()以外的其他内容,您应该没问题。