7

我有一个test.html带有缓存清单的 HTML5 测试网页。该网页向同一服务器发出 Ajax 请求,向缓存清单中do_get_data.php的部分下列出的网页发出 Ajax 请求。NETWORK:

该请求由 Firefox 10 和 iPhone iOS 5 Safari 执行(这记录在服务 PHP 脚本中do_get_data.php)。Firefox 10success在 10 秒后调用回调函数,即从服务器返回数据时。但是,我的 iPhone iOS 5 Safarifail在开始请求后立即调用回调函数并且不调用success回调函数。

对于 iPhone iOS 5 Safari,textStatusiserrorJSON.stringify(jqXHR)is {"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

我已经了解到,状态码 0 的原因是(1)从 加载file://,(2)无法访问的网络资源和(3)跨域策略。由于您加载了 PHP,我们可以安全地统治数字 1,并且由于您的服务器也记录 Safari 的数字 2,因此我们只剩下 3。以上所有代码是否都位于同一个域中?如果没有,请使用Access-Control-Allow-OriginPHP 中的 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 回答
2

我已经为此苦苦挣扎了一段时间,答案在错误报告答案中:

利用

网络: *

在缓存清单中以避免缓存ajax请求。

于 2014-07-10T22:24:13.933 回答
1

如果您将$.ajax呼叫更改为

$.ajax({
    url: testurl,
    cache: false,
    type: "GET",
    data: senddata
}).then(
    function(result) { test_ok(result); },
    function(result) { testFail(result); }
);
于 2012-03-02T03:50:47.003 回答
1

不确定您如何在 iOS 下运行您的网站,但在使用清单文件时 jQuery 和 AJAX 请求存在问题:http: //bugs.jquery.com/ticket/8412

尽管您已经在清单的 NETWORK 部分下列出了资源,但我建议您尝试那里列出的其他解决方法:

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