【问题标题】:Socket not working on jQuery Mobile events套接字不适用于 jQuery Mobile 事件
【发布时间】:2014-07-28 04:57:43
【问题描述】:

我刚刚开始使用 jQuery Mobile 为 fxos 开发一个带有 javascript 的应用程序,并且已经遇到了与框架相关的问题。对于我的应用程序,我需要使用 mozilla API (mozTCPSocket) 提供的 tcp 通信,当我在 JQM 事件之外运行它时它运行良好,但是当我从 JQM 事件(例如 pageshow)调用 socket.open() 时它看起来套接字对象在每次调用后都被杀死了。

这是我的代码:

window.addEventListener('DOMContentLoaded', function() {
    'use strict';

    var socket;
    var host = "someserver";
    var port = 6667;
    //connect(); // when calling from here, connection works fine

    $(document).bind("pageshow", function(e) {
        if (typeof e.currentTarget.URL==="string") {
            var haystack = $.mobile.path.parseUrl(e.currentTarget.URL);
            var needle = /^#server/;
            if (haystack.hash.search(needle)!==-1) {
                connect(); // ...from here is failing
            }
        }
    });

    function connect() {
        socket = navigator.mozTCPSocket.open(host,port);
    }

    socket.ondata = function (event) {
        var data = event.data;
        var lines = data.split('\r\n');
        for (var i=0;i<lines.length;i++) {
          if (lines[i].length>0) console.log(lines[i]);
        }
    }
});

可能出了什么问题?

【问题讨论】:

  • 您使用的是什么版本的 JQM?它是否命中了该事件中的其他代码?
  • 连接的位置应该没有区别,除非在pageshow 事件之后加载了实际不同的页面。所以你确定你通过那个事件点击了连接逻辑?
  • @Archon 我正在使用 jQM 1.4.3 和 jQuery 2.1.1 ¿我应该降级吗?
  • @JanJongboom 它是通过connect(),唯一的区别是当从pageshow事件调用connect()时,socket.ondata事件永远不会被调用
  • 尝试将window.addEventListener('DOMContentLoaded',更改为document.addEventListener('mobileinit',

标签: javascript jquery jquery-mobile firefox-os


【解决方案1】:

这里肯定有问题:

socket.ondata = function (event) {
    var data = event.data;
    var lines = data.split('\r\n');
    for (var i=0;i<lines.length;i++) {
      if (lines[i].length>0) console.log(lines[i]);
    }
}

您正在为 undefined 对象设置 ondata 方法。这意味着以后对connect() 的任何调用都不会产生任何影响。此外,当您定义 undefined 对象的方法时,上述方法可能会崩溃。

你应该把你的代码改写成这样。

window.addEventListener('DOMContentLoaded', function() {
    'use strict';

    var socket;
    var host = "someserver";
    var port = 6667;
    //connect(); // when calling from here, connection works fine

    $(document).bind("pageshow", function(e) {
        if (typeof e.currentTarget.URL==="string") {
            var haystack = $.mobile.path.parseUrl(e.currentTarget.URL);
            var needle = /^#server/;
            if (haystack.hash.search(needle)!==-1) {
                connect(); // ...from here is failing
            }
        }
    });

    function connect() {
        socket = navigator.mozTCPSocket.open(host, port);
        socket.ondata = onData;
    }

    function onData (event) {
        var data = event.data;
        var lines = data.split('\r\n');
        for (var i=0;i<lines.length;i++) {
          if (lines[i].length>0) console.log(lines[i]);
        }
    }
});

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多