为什么我无法在cordova中访问全局JS变量?
问题描述:
对不起,这可能是一个非常不好的问题,可能已经被问到了。然而,我找不到回答我的具体问题的帖子,所以我仍然在那里问。为什么我无法在cordova中访问全局JS变量?
请注意,我完全是JavaScript的新手,我来自面向对象的编程语言。在回答时请保持在明!
我想让我的科尔多瓦应用程序连接到websocket服务器。由于我的应用程序只适用于Android 4.4及以上版本,我想出了使用javascript的window.WebSocket对象是一个好主意。因此,我创建一个像这样的“全局”变量:
var socket = null;
var app = {
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
...
}
我可以使用下面的代码成功地创建的WebSocket对象:
websocketSetup: function() {
var serverUrl = "ws://echo.websocket.org";
var logdiv = document.getElementById("logs");
//Called when the client opents the conection to the server
var onOpen = function() {
logdiv.innerHTML += "<p class='purple'>Websocket opened: " + serverUrl + "</p>";
socket.send("Hello");//FIXME: remove this line
};
//Called when the client or the server drops the connection, or sends a close request
var onClose = function() {
logdiv.innerHTML += "<p class='purple'>Websocket closed.</p>";
socket = null;
};
//Called when the client recieves a request from the server
var onMessage = function(event) {
logdiv.innerHTML += "<p class='purple'>Message:" + event.data + "</p>";
};
//Called from the client websocket implementation when an error happens
var onError = function(event) {
logdiv.innerHTML += "<p class='purple'>" + event.data + "</p>";
};
try{
socket = new WebSocket("ws://echo.websocket.org");
socket.onopen = onOpen;
socket.onclose = onClose;
socket.onmessage = onMessage;
socket.onerror = onError;
}catch(e){
logdiv.innerHTML += "<p class='red'>" + e + "</p>";
}
},
这一切正常,我成功地从回声获得回声websocket服务器。 但是,我无法再访问此套接字变量了。功能,如:
socketMessage: function(outgoingmessage) {
socket.send(outgoingmessage);
var logdiv = document.getElementById("logs");
logdiv.innerHTML += "<p class='purple'>Message sent to WS:" + outgoingmessage + "</p>";
}
根本不起作用,只要我指的是插座变量,函数停止它的执行。它也不会抛出我可以尝试/捕捉的异常。
感谢您的帮助!
答
嗯,我发现这个问题,这主要是由于我对JavaScript的不了解。
应用程序初始化后,套接字变量不再存在,因为它没有正确设置为全局变量。
socket = null;
此代码将添加插座变量作为全局对象的属性,将使其持续性和可访问来自世界各地。