javascript - Phonegap 忽略空全局对象

标签 javascript cordova phonegap-cli

我正在测试一个 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/

相关文章:

Cordova-icon 在运行时出错

javascript - 未捕获的 TypeError : Cannot read property 'OneSignal' of undefined", 来源:file:///android_asset/www/js/app

ios - cordova 'NSInternalInconsistencyException',原因 : 'ERROR: config. xml 不存在

Android Notification.BigTextStyle 行为

javascript - 我在 bootstrap 中有一个表 - 如何添加一个包含所选行的删除按钮的列?

javascript - 轨道 4 Javascript : Having trouble with image paths

javascript - RoR无需刷新召回功能

javascript - Red5 与 JavaScript 客户端聊天

javascript - 显示从相机拍摄的图像

android - phonegap android 2.2 调用 javascript