6

Android 4.0、4.1、および4.2の組み込みブラウザーに問題があります(テストするためにこれより低いものはありません)。問題は、ajax呼び出しが最初のロードで完全に機能することです。実行Ajaxボタンを何度でも押すことができ、問題はありません。あなたはインターネットから切断することができ、それは正しく動作します。ただし、ブラウザを終了して(完全に、バックグラウンドで実行されているだけではないことを確認してください)、ブラウザを再起動すると、ロード時およびボタンを押したときに失敗します。オンラインかオフラインかは関係ありません。ajax呼び出しから返されるエラーは、status=0およびreadyState=0の「Error」
です。成功すると、status=200およびreadyState=4の「resposefromAjaxCall」というメッセージが返されます。

このコードは、Android Chrome、Firefox、Operaでテストした他のすべてのブラウザで動作します。IOS 5および6では動作し、すべてのデスクトップブラウザを見つけることができます。私が見逃しているものや、組み込みのブラウザにバグを見つけたものはありますか?これに関するどんな助けも、特にそれが私がしたただの愚かなことであるならば、ありがたいです。

この問題をうまく示すテストスクリプトを作成し、このメッセージの下部に添付しました。

ありがとう

ティム

test.php

<?php     
function displayPage() { 
?>
<!DOCTYPE html>
<html manifest="test.manifest" debug="true">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1" >
        <title>test</title>
        <script type="text/javascript" src="jquery-1.9.0.min.js"></script>
        <script type="text/javascript">
            function runAjaxGet() {
                var XMLHttpRequest = $.ajax({
                    url: "test.php",
                    dataType: "json",
                    data: "test=test",
                    traditional: "true",
                    success: function( responseData ) {
                        alert('good\n responseData: '+responseData+ '\n res:' + XMLHttpRequest.responseText +'\n readyState: '+ XMLHttpRequest.readyState + '\n Status: '+XMLHttpRequest.status );
                        console.log(XMLHttpRequest);
                   },
                   error: function (xhr, ajaxOptions, thrownError, responseData) {  
                       alert('bad\n responseData: '+responseData+ '\n res:' + XMLHttpRequest.responseText +'\n readyState: '+ XMLHttpRequest.readyState + '\n Status: '+XMLHttpRequest.status);
                       console.log(XMLHttpRequest);
                   }
                });
            }
            $(document).ready(function() { 
                runAjaxGet();
            });

        </script>
    </head>
    <body>
        <button Name="Run Ajax" onclick="runAjaxGet();">Run Ajax</button>
    </body>
</html>
<?php
}

function processRequests() {
    header("Content-Type: application/json; charset=UTF-8" );
    echo (json_encode("respose from Ajax Call"));
}

date_default_timezone_set ( "UTC" );

if (isset($_REQUEST['test'])) {
    $which = $_REQUEST['test'];
} else {
    $which = '';
}

switch ($which) {
    case "test":
        processRequests();
        break;

    default :
        displayPage();
        break;
}
?>

test.manifest

 CACHE MANIFEST
 test.php
 jquery-1.9.0.min.js
 test.php?test=test
4

2 に答える 2

0

私はこれと同じ問題に遭遇し、キャッシュから取得したときに 0 が成功を示すと判断しました。これは、リクエストが完全にローカルで解決されるため、実際の http リクエストが関与していないことが原因である可能性があります。

Appcache マニフェスト ファイル:

CACHE MANIFEST

CACHE:
/config

Javascript:

var request = new XMLHttpRequest();
request.open('GET', '/config', false); // async=false is ok because this file will always come from AppCache
request.send(null);

// Older versions of android return 0 when ajax request retrieved from appcache
if (request.status == 200 || request.status == 0) {
  return JSON.parse(request.responseText);
} else {
  console.log("ERROR: config not retrievable");
  throw "Attempt to retrieve config return http status " + request.status;
}
于 2015-02-12T05:19:24.313 に答える