7

test.htmlキャッシュ マニフェストを含む HTML5 テスト Web ページがあります。Web ページは、キャッシュ マニフェストdo_get_data.phpのセクションの下にリストされている Web ページに対して、同じサーバーに対して Ajax 要求を実行します。NETWORK:

リクエストは、Firefox 10 と iPhone iOS 5 Safari の両方で実行されます (これは、サービング PHP スクリプトに記録されますdo_get_data.php)。Firefox 10 は、success10 秒後、つまりサーバーからのデータが返されたときにコールバック関数を呼び出します。ただし、私の iPhone iOS 5 Safari はfail、リクエストを開始した直後にコールバック関数を呼び出し、successコールバック関数を呼び出しません。

iPhone iOS 5 Safari の場合、textStatuserrorおよびJSON.stringify(jqXHR)です{"readyState":0,"responseText":"","status":0,"statusText":"error"}

リクエストは、 の次のコードを使用して実行されtest.htmlます。

<script type="text/javascript">
    function test_ok(data) {
        alert('Test OK, data: ' + JSON.stringify(data));
    }
    function testFail(jqXHR, textStatus) {
        alert(textStatus + ' | ' + JSON.stringify(jqXHR));
    }
    function get_data(testurl) {
        var senddata, request;
        alert('Request for ' + testurl + ' started.');
        window.testid = new Date().getTime();
        senddata = {
            background: true,
            requestId: window.testid
        };
        request = $.ajax({
            url: testurl,
            cache: false,
            type: "GET",
            data: senddata,
            success: test_ok
        });
        request.fail(testFail);
    }
</script>
<input type="button" onclick="get_data('do_get_data.php')" value="test sending" />

参考までに、do_get_data.php次のようになります。

<?php
    $id = md5(rand() . rand());
    trigger_error(implode("\t", array('start', $id, $_SERVER['REQUEST_URI'], $_SERVER['REMOTE_ADDR'], $_SERVER['USER_AGENT']));
    sleep(10);
    header('Content-Type: application/json');
    $json = json_encode(array('msg'=>'Test was OK'));
    trigger_error(implode("\t", array('echo', $id, $json));
    echo $json;
?>
4

4 に答える 4

2

私はしばらくこれに苦労してきましたが、答えはバグレポートの答えにありました:

使用する

通信網: *

キャッシュ マニフェストで ajax リクエストもキャッシュしないようにします。

于 2014-07-10T22:24:13.933 に答える
2

file://ステータス コード 0 の原因は、(1) からの読み込み、(2) 到達不能なネットワーク リソース、および (3) クロス ドメイン ポリシーであることがわかりました。あなたが PHP をロードしているので、私たちは 1 番を安全にルール化できます。あなたのサーバーは Safari も 2 番をログに記録しているので、3 番が残ります。上記のコードはすべて同じドメインにありますか? そうでない場合はAccess-Control-Allow-Origin、PHP で HTTP ヘッダーを使用して、クロス ドメイン リクエストを許可します。

header('Access-Control-Allow-Origin: http://example.org')

また、ボタン入力のクリックは、他のデフォルトの動作のみを実行し、onclick他のデフォルトの動作は実行しないことを確認する必要があります (iOS での動作に関係なく)。falseハンドラーから戻るonclickと、それが妨げられます。

<input type="button" onclick="get_data('do_get_data.php'); return false" ... />

アップデート:

最後の手段として、キャッシュ マニフェストを無効にして、バグのある可能性のある実装を邪魔にならないようにすることができます。

于 2012-03-02T13:03:58.267 に答える
1

iOS でサイトをどのように実行しているかわかりませんが、マニフェスト ファイルを使用しているときに jQuery および AJAX リクエストに問題がありました: http://bugs.jquery.com/ticket/8412

マニフェストの NETWORK セクションに既にリソースをリストしていますが、そこにリストされている他の回避策を試すことをお勧めします。

jQuery.ajaxSetup({
  isLocal: true
});
于 2012-03-04T03:25:43.193 に答える