【问题标题】:deviceReady not working in PhoneGap application, how to?deviceReady 在PhoneGap 应用程序中不起作用,怎么办?
【发布时间】:2012-01-24 06:13:40
【问题描述】:

我有一个简单的 PhoneGap 应用程序作为休闲:

<!DOCTYPE HTML>
<html>
    <head>
        <title>PhoneGap powered App</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="css/jquery.mobile-1.0.min.css" />
        <script type="text/javascript" charset="utf-8" src="phonegap-1.3.0.js"></script>
        <script src="js/jquery-1.7.1.min.js"></script>
        <script src="js/jquery.mobile-1.0.min.js"></script>


    <script type="text/javascript" charset="utf-8">

        document.addEventListener("deviceready", onDeviceReady, true); 
        function onDeviceReady() {
            alert ('123');
        }
    </script>

    </head>
    <body onload="onDeviceReady()">
        <div data-role="page">

            <div data-role="header">
                <h1>title</h1>
            </div><!-- /header -->

            <div data-role="content">   
                <h2>Begin by inserting your credentials.</h2>
                ...
            </div><!-- /content -->

        </div><!-- /page -->

        <script type="text/javascript" charset="utf-8">
            $(document).ready(function () {

            });
        </script>
    </body>
</html>

这里发生的是警报alert ('123'); 永远不会被触发。但是,如果我取出其他 JavaScript 代码并只留下警报,它就会被触发。

另外,如果我使用$(document).ready(function () { alert ('123'); },我会收到警报。

这里发生了什么,为什么deviceready 没有被解雇?

有什么想法吗?

【问题讨论】:

  • 你在使用它之后定义函数。将函数定义放在document.addEventListener(...) 调用之上,它应该可以工作。

标签: javascript jquery android cordova


【解决方案1】:

试试这个方法:

 document.addEventListener("deviceready", function(){
      alert("123");
 },true);

【讨论】:

  • 不确定。可能是语法问题。像这样尝试: document.addEventListener("deviceready", onDeviceReady(), true);或尝试更改函数的名称,例如 myDeviceReady()。
  • document.addEventListener("deviceready", onDeviceReady(), true); 无法工作,因为您正在传递未定义的 onDeviceReady 的返回值,但 addEventListener 需要一个函数。
  • @Patrioticcow 试着把document.addEventListener("deviceready", onDeviceReady, true); 写在函数定义的下面而不是上面。
【解决方案2】:

@GPRathour 提供的内容有效,因为document.addEventListener() 正在侦听deviceready,如果为真,则运行您的警报功能。我没有按照你的方式工作,原因有两个:

1) 当 DOM 加载并到达你的 body 标签时,它正在调用 OnDeviceReady() 并且侦听器从未接到过调用,因此 phonegap 不知道它已准备好运行。

2) 你必须在函数中调用你的监听器并使用'false':

function init(){
  document.addEventListener("deviceready", onDeviceReady, false);
}

function onDeviceReady(){
  alert('123');
}

<body onload="onDeviceReady()"></body>

查看 phonegap API,了解为什么在侦听器中使用 false 而不是 true,这与默认设置有关,但值得一读以了解 phonegap 侦听器的工作原理。

【讨论】:

【解决方案3】:

万一你和我有同样的问题,我不知道需要在你的 index.html 中包含cordova.js 脚本,你不必提供文件或参考,只需包含这个行:

<script type="text/javascript" charset="utf-8" src="cordova.js"></script>  

然后 Cordova 将在编译时使用该库,然后调度事件。

【讨论】:

  • 记得从空白应用程序中删除默认的 index.js。
【解决方案4】:

这段代码对我有用

<body onload="init()"></body>

function init() {
    document.addEventListener("deviceready", onDeviceReady, false);
}
function onDeviceReady() {
    // Now safe to use the Cordova API
}

愉快的编码......

【讨论】:

    【解决方案5】:

    当使用 PhoneGap 3.0WP8 时,Device Ready 将不起作用,因为 Visual Studio 解决方案中不包含 Phonegap.js

    解决方案是暂时手动包含它。

    【讨论】:

      【解决方案6】:

      在你的文档准备好内添加你的事件监听器为 deviceready...

      <script type="text/javascript" charset="utf-8">
          $(document).ready(function () {
               document.addEventListener("deviceready", onDeviceReady, true); 
          });
      
          function onDeviceReady() {
              alert ('123');
          }
      </script>
      

      您不想调用 onDeviceReady(),因为这将在您添加侦听器时运行该函数...

      【讨论】:

        【解决方案7】:

        在一个或多个平台上未触发 ondeviceready 事件的主要原因是当您尝试使用错误平台的 cordova/phonegap js 时。

        【讨论】:

        • 完全清楚的是,如果你在 ios 上使用 android 版本的 cordova-xx.js,它是行不通的,而且由于它们的名称都相同,所以有时会发生这种情况。跨度>
        【解决方案8】:

        检查您在项目中添加的 Cordova/phonegap 库/jar 文件的版本(在 libs 下)以及您添加的 脚本在 HTML 文件中引用。如果不匹配,可能无法在项目中引用。因此,cordova 无法执行其功能。

        【讨论】:

        • 我遇到了这个问题,因为我创建了一个使用 cordova-1.6.1.js 的示例,但使用的是 Phonegap v3.4 CLI。我通过用 3.4 版本 (github.com/apache/cordova-ios/releases/tag/3.4.0) 中的文件替换 cordova JS 文件来修复它。
        【解决方案9】:

        就我而言,我需要删除 元 http-equiv="Content-Security-Policy" content="...

        【讨论】:

          【解决方案10】:

          在定义处理程序之前,您将处理程序绑定到 deviceready。

          正确的是:

          function onDeviceReady(){
              alert('123')
          }
          
          document.addEventListener("deviceready", onDeviceReady, false);
          

          显然您的 phonegap-2.0.0.js 文件(或其他版本)应该包含在此之前的文件中。

          【讨论】:

          • 你的答案是错误的,但我不会投反对票,但请阅读javascript中的Function Hoisting以避免将来出现错误的答案。
          【解决方案11】:

          确保下面的路径是正确的,并且两者都需要包含在 html 中:

                  <script type="text/javascript"  src="cordova.js"></script>
                  <script src="js/jquery-1.11.2.min.js"></script>
          
            <script type="text/javascript">
                  $(document).ready(function(){
                  document.addEventListener("deviceready", onDeviceReady, false);
                  });
          
                  function onDeviceReady() {
                  alert("inside onDeviceReady");
                  }
                  </script>
          

          【讨论】:

            【解决方案12】:

            我在你的代码中看到一个问题,在方法中,你需要在这里添加onDeviceReady()等于:

            document.addEventListener("deviceready", onDeviceReady(), false);
            

            这对我有用!

            【讨论】:

            • 在定义侦听器时调用 onDeviceReady。您应该更改它,使其显示document.addEventListener("deviceready", onDeviceReady, false); 这可能会使您的代码无法执行,因为deviceready 函数可能永远不会触发,具体取决于您添加此代码的位置。现在您的代码将始终执行onDeviceReady,因为您会立即调用它。
            【解决方案13】:

            PhoneGap 示例的最大问题是不正确的 javascript 语法。请注意这个..对于这个问题,onDeviceReady 应该有大括号...

            document.addEventListener("deviceready", onDeviceReady(), true); 
            function onDeviceReady() {
                alert ('123');
            }
            

            【讨论】:

            • 你错了。您想传递对函数的引用,而不是执行它。
            • 这是不正确的。正如@DriverDan 之前正确建议的那样,DeviceReady 不应该在第一行有括号,因为这将导致方法执行而不是赋值/引用。
            • 那里不需要圆括号。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-17
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多