尽管执行了Ajax请求并且服务器返回带有数据的200,但调用了失败回调

时间:2012-02-24 12:07:37

标签: javascript jquery ajax html5 cache-manifest

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

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

对于iPhone iOS 5 Safari,textStatuserrorJSON.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 个答案:

答案 0 :(得分:2)

我已经了解,状态码0的原因是(1)从file://加载,(2)无法访问的网络资源和(3)跨域策略。由于你加载了PHP,我们可以安全地规定1号,因为你的服务器也记录了Safari也是数字2,这使我们得到3.上述所有代码是否都在同一个域上?如果没有,请使用PHP中的Access-Control-Allow-Origin 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" ... />

<强>更新

作为最后的手段,您可以随时简单地禁用缓存清单,以将其可能错误的实现移开。

答案 1 :(得分:2)

我一直在努力解决这个问题,答案是在错误报告中回答:

使用

NETWORK: *

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

答案 2 :(得分:1)

如果您将$.ajax来电更改为

,该怎么办?
$.ajax({
    url: testurl,
    cache: false,
    type: "GET",
    data: senddata
}).then(
    function(result) { test_ok(result); },
    function(result) { testFail(result); }
);

答案 3 :(得分:1)

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

虽然您已经在清单的NETWORK部分下列出资源,但我建议您尝试其中列出的其他解决方法:

jQuery.ajaxSetup({
  isLocal: true
});