我刚刚开始使用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]);
}
}
});