Вызван неудачный обратный вызов, хотя Ajax-запрос выполняется, и сервер возвращает 200 с данными
У меня есть тестовая веб-страница HTML5 test.html
с манифестом кэша. Веб-страница делает запрос Ajax на тот же сервер, на веб-страницу do_get_data.php
что указано в разделе NETWORK:
в манифесте кеша.
Запрос выполняется Firefox 10 и iPhone iOS 5 Safari (это записано в обслуживающем скрипте PHP do_get_data.php
). Firefox 10 вызывает success
функция обратного вызова через 10 секунд, то есть когда возвращаются данные с сервера. Тем не менее, мой 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;
?>
4 ответа
Я боролся с этим некоторое время, и ответ был в ответах об ошибках:
использование
СЕТЬ: *
в манифесте кеша, чтобы избежать кеширования запроса ajax тоже.
Мне дано понять, что причинами кода состояния 0 являются (1) загрузка из file://
(2) недоступный сетевой ресурс и (3) междоменная политика. Так как вы загружаете PHP, мы можем безопасно управлять номером 1, и поскольку ваш сервер регистрирует в Safari также и номер 2, что оставляет нам 3. Имеет ли весь приведенный выше код один и тот же домен? Если нет, используйте Access-Control-Allow-Origin
HTTP-заголовок в PHP, чтобы разрешить междоменные запросы.
header('Access-Control-Allow-Origin: http://example.org')
Кроме того, вы должны убедиться, что нажатие на кнопку ввода выполняет только onclick
и не любое другое поведение по умолчанию (что бы это ни было на iOS). возврате false
от onclick
Обработчик помешает этому:
<input type="button" onclick="get_data('do_get_data.php'); return false" ... />
ОБНОВИТЬ:
В качестве последнего средства вы всегда можете просто отключить манифест кэша, чтобы убрать его, возможно, ошибочную реализацию.
Не знаю, как вы используете свой сайт под iOS, но при использовании файлов манифеста возникла проблема с запросами jQuery и AJAX: http://bugs.jquery.com/ticket/8412
Несмотря на то, что вы уже перечислили ресурс в разделе NETWORK манифеста, я бы предложил попробовать другой обходной путь, указанный там:
jQuery.ajaxSetup({
isLocal: true
});
Что делать, если вы измените $.ajax
позвонить
$.ajax({
url: testurl,
cache: false,
type: "GET",
data: senddata
}).then(
function(result) { test_ok(result); },
function(result) { testFail(result); }
);