我正在测试一个 html 页面的phonegap 应用程序。它在我的浏览器中运行得很好,但是当我通过 PhoneGap CLI 在手机上测试它时,它完全崩溃了。我用 Weinre 设置了它,但它不像浏览器那样在控制台中显示错误。反正。我已经将范围缩小到这样一个事实:我在 js 开头定义的全局空对象被视为未定义,因此当我尝试添加到它时,代码只是拒绝启动循环。在 Chrome 日志中,它被正确定义为一个对象并且工作完美。
这是我的代码:
var holding_layers_info = {};
function my_function() {
console.log(typeof holding_layers_info); // this logs undefined on PhoneGap App and object on Chrome log
// my loop here, adding values to holding_layers_info, which doesn't run because of the undefined object above
}
我对此完全感到困惑,在网上找不到类似的东西,也不知道从哪里开始修复它。使用 var Holding_layers_info = new Object();
定义空对象或简单地将其保留为 var Holding_layers_info;
也没有任何区别,不是我想象的那样。
函数中定义的空对象按预期工作,但我需要它是全局的。
编辑:这是我的index.html的删节版本:
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
<!-- This is a wide open CSP declaration. To lock this down for production, see below. -->
<!-- <meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src *" /> -->
<!-- Good default declaration:
* gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
* https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
* Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
* Enable inline JS: add 'unsafe-inline' to default-src
* Enable eval(): add 'unsafe-eval' to default-src
* Create your own at http://cspisawesome.com
-->
<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: 'unsafe-inline' https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *" /> -->
<link rel="stylesheet" type="text/css" href="css/ol.css">
<link rel="stylesheet" type="text/css" href="css/index.css" />
<link rel="stylesheet" type="text/css" href="css/fonts.css" />
<link rel="stylesheet" type="text/css" href="css/easy-autocomplete.css" />
<title>La la la</title>
</head>
<body>
<!-- Boring HTML-only page content here -->
<script src="https://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
crossorigin="anonymous"></script>
<script type="text/javascript" src="js/ol.js"></script>
<script type="text/javascript" src="js/general.js"></script>
<script type="text/javascript" src="js/jquery.easy-autocomplete.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript">
app.initialize();
</script>
</body>
</html>
最佳答案
在我加载的第一个 JS 脚本中,我确保我有这个函数用于调试目的:
//debugging
var debug = true;
if (debug) {
window.onerror = function (msg, url, linenumber) {
alert('Error message: ' + msg + '\nURL: ' + url + '\nLine Number: ' + linenumber);
return true;
};
}
这基本上会警告通常来自控制台的每个错误。如果这给您带来错误,我认为这将非常有帮助!
根据我们现在掌握的信息,我很确定没有人能真正回答你的问题。实在是太模糊了。回到我身边 =)
<小时/>我只是要把这个扔出去,因为你永远不知道:
您是否忘记从 Phonegap 模板附带的 index.js
中删除 onDeviceReady
功能?
谈论这部分:
onDeviceReady: function() {
app.receivedEvent('deviceready'); //You should place YOUR starting function here!
},
receivedEvent: function(id) {
var parentElement = document.getElementById(id);
app.receivedEvent('deviceready');
var receivedElement = parentElement.querySelector('.received');//Quite sure you removed this element from the DOM :)
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
你看,这部分正在选择你可能已经删除的 DOM 元素。我在我的项目中注意到,当您在不存在的元素上触发某些内容时,chrome 不会再杀死您的 JS。
从那里调用您自己的(起始)函数,会像这样:
onDeviceReady: function() {
MyInitFunction();
}
--您可以删除其余部分。 (整个 receivedEvent:
函数)
顺便说一句,我现在看到您正在使用 jQuery 1.x。由于您正在创建移动应用程序,因此您实际上不必担心旧浏览器的向后兼容性。我目前正在使用 2.x,但我认为切换到新的(更快)3.x 不会有什么坏处
关于javascript - Phonegap 忽略空全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420560/