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

前端之家收集整理的这篇文章主要介绍了javascript – 虽然执行了Ajax请求并且服务器返回带有数据的200,但调用失败回调前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有缓存清单的 HTML5测试网页test.html.该网页向同一服务器发送Ajax请求,并向缓存清单中的NETWORK:部分下列出的网页do_get_data.PHP发出请求.

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

对于iPhone iOS 5 Safari,textStatus是错误的,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',$json));
    echo $json;
?>

解决方法

我已经了解,状态码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上可能存在的任何行为).从onclick处理程序返回false会阻止它:

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

更新:

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

原文链接:https://www.f2er.com/ajax/156968.html

猜你在找的Ajax相关文章