Вызван неудачный обратный вызов, хотя 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); }
);
Другие вопросы по тегам