Socket不能在jQuery Mobile事件上工作



我刚刚开始使用jQuery Mobile为fxos开发一个javascript应用程序,并且已经遇到了一个框架相关的问题。对于我的应用程序,我需要使用mozilla API (mozTCPSocket)提供的tcp通信,当我从JQM事件外部运行它时,它工作得很好,但是当我从JQM事件(例如:

下面是我的代码:
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('rn');
        for (var i=0;i<lines.length;i++) {
          if (lines[i].length>0) console.log(lines[i]);
        }
    }
});

出了什么问题?

这里肯定有问题的是:

socket.ondata = function (event) {
    var data = event.data;
    var lines = data.split('rn');
    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('rn');
        for (var i=0;i<lines.length;i++) {
          if (lines[i].length>0) console.log(lines[i]);
        }
    }
});

最新更新