Вызван неудачный обратный вызов, хотя Ajax-запрос выполняется, и сервер возвращает 200 с данными - PullRequest
7 голосов
/ 24 февраля 2012

У меня есть тестовая веб-страница 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 ]

2 голосов
/ 11 июля 2014

Я боролся с этим некоторое время, и ответ был в ответах об ошибках:

использовать

СЕТЬ: *

в манифесте кэша, чтобы избежать кеширования запроса ajax.

2 голосов
/ 02 марта 2012

Мне дали понять, что причинами кода состояния 0 являются (1) загрузка из file://, (2) недоступный сетевой ресурс и (3) междоменная политика.Так как вы загружаете PHP, мы можем безопасно управлять номером 1, и поскольку ваш сервер регистрирует в Safari также и номер 2, что оставляет нам 3. Имеет ли весь приведенный выше код один и тот же домен?Если нет, используйте HTTP-заголовок Access-Control-Allow-Origin в 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" ... />

ОБНОВЛЕНИЕ:

В качестве крайней меры вы всегда можете просто отключить манифест кэша дляуберите его, возможно, ошибочную реализацию.

1 голос
/ 04 марта 2012

Не знаю, как вы используете свой сайт под iOS, но при использовании файлов манифеста возникла проблема с запросами jQuery и AJAX: http://bugs.jquery.com/ticket/8412

Несмотря на то, что вы уже перечислили ресурс в разделе СЕТИ манифеста, я бы посоветовал попробовать другой обходной путь, указанный там:

jQuery.ajaxSetup({
  isLocal: true
});
1 голос
/ 02 марта 2012

Что если вы измените свой $.ajax звонок на

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