【问题标题】:Ajax request works on browser but not on Android deviceAjax 请求适用于浏览器,但不适用于 Android 设备
【发布时间】:2015-09-02 11:48:52
【问题描述】:

我正在使用 Cordova 制作一个简单的移动应用程序。我的代码在浏览器中测试时运行良好,但在 Android 手机上测试时忽略了成功功能,并直接从 db.js 打印错误消息。

这里是相关的index.html

 <body>
    <div class="app">
        <h1></h1>
        <div id="deviceready" class="blink">
            <div>
                <div id="output"></div>
            </div>
        </div>
    </div>
    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
    <script type="text/javascript" src="js/db.js"></script>
</body>

带有ajax功能的db.js

$(document).ready(function() {
  $(document).bind('ready', function() {
   var output = $('#output');

   $.ajax({
    url: 'http://domainName/server/folder/db.php',
    dataType: 'jsonp',
    jsonp: 'jsoncallback',
    timeout: 5000,
    success: function(data, status){
       $.each(data, function(i, item){
       var cards = '<h1>' + item.title + '</h1>' + item.body 
       + '<br>' + '<img src="img/' + item.slug + '.jpg"' + '>' + '<br>' ;

       output.append(cards);

    });
  },
  error: function(){
      output.text("There was an error loading the data.");  
  }
 });
 });
 });

db.php

<?php
   header('Content-type: application/json');

   $host = 'hostname';
   $dbname = 'database';
   $user = 'username';
   $pass = 'passoword';

   $jsoncallback = isset($_GET['jsoncallback'])? $_GET['jsoncallback'] : "";

   $con = mysql_connect($host, $user, $pass) or die("Could not connect: " . mysql_error());
   mysql_select_db($dbname, $con);

   $sql = "SELECT * FROM cards";
   $result = mysql_query($sql) or die("Query error: " . mysql_error());

   $records = array();

   while($row = mysql_fetch_assoc($result)) {
        $records[] = $row;
   }

   mysql_close($con);
        echo $jsoncallback . '(' . json_encode($records) . ');';

所有域都被列入白名单:

<access origin="*" />

Android 清单中的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

有什么想法吗?

【问题讨论】:

  • 您是否尝试过打印错误信息:function(e){ output.text("Error: "+e); }?
  • 是:error:function(){output.text("There was an error loading the data.")}; 在设备屏幕上打印。在浏览器上执行成功函数时。
  • 在科尔多瓦中,您应该等待deviceready 事件,然后再执行任何操作。看到这个:stackoverflow.com/a/32351495/3340702

标签: javascript android jquery ajax cordova


【解决方案1】:

您是否尝试过将代码放入 deviceready 中?假设您的 html 起始索引文件如下所示,

<html>
<head> </head>
<body onload="onBodyLoad()" >
</body>
</html>

您的脚本文件如下所示。

<script>
function onBodyLoad() {
    document.addEventListener("deviceready", onDeviceReady, false);
}
function onDeviceReady() {
// do your thing here!
}
</script>

【讨论】:

  • Deviceready 在应用程序开始时运行,如this。为了以防万一,我确实将 jquery 代码放在了 bindEvents(在 index.js 中)函数下,但我得到了相同的结果:脚本在浏览器上成功执行,在设备上执行失败。
【解决方案2】:

我通过使用 Phonegap(而不是 Cordova)构建一个新项目来实现它。否则完全相同的代码。仍然不知道为什么它不适用于 Cordova。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多