【发布时间】:2014-07-11 06:24:13
【问题描述】:
我有一个带有缓存清单的 HTML5 测试网页 test.html。该网页向同一服务器发出 Ajax 请求,向缓存清单中 NETWORK: 部分下列出的网页 do_get_data.php 发出请求。
该请求由 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,textStatus 是 error,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;
?>
【问题讨论】:
-
如果你删除 sleep(10) 会发生什么?
-
我是否理解正确,您有一个日志显示服务器端来自 Safari 的成功请求?
-
@asaddude 即使我删除了 sleep(10),情况也是一样的。是的,服务器端的日志显示的是 Safari。
-
我看到您使用 AJAX 回调的混合定义 - 新方式 (
jqXHR.fail()) 和旧方式 ($.ajax()的success选项)。组合有什么特别的原因吗?当分别使用jqXHR.done()或error选项时,是否会产生相同的结果? -
@Petr 没有充分的理由进行组合。但是,
done()或error选项很遗憾不会改变它在 Firefox 中有效但在 iOS 5 Safari 中无效的事实。
标签: javascript jquery ajax html cache-manifest