Ответ jQuery $ .ajax пуст, но только в Chrome - PullRequest
8 голосов
/ 18 июня 2010

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

Относительно прямолинейная настройка, у меня есть html-страница с некоторым javascript, который делает ajax-запрос к URL-адресу (в том же домене), java-приложение в фоновом режиме делает свое дело и возвращает частичную html-страницу (без html теги head или body, только содержимое), которые должны быть вставлены в определенную точку на странице.

Все звучит довольно легко, и код, который у меня есть, работает в IE, Firefox и Safari, но не в Chrome. В Chrome целевой элемент просто оказывается пустым, и, если я посмотрю на запрос ресурса в инструментах разработчика Chromes, содержимое ответа также будет пустым.

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

var container = $('#container');

$.ajax({
    type: 'GET',
    url: '/path/to/local/url',
    data: data('parameters=value&another=value2'),
    dataType: 'html',
    cache: false,
    beforeSend: requestBefore,
    complete: requestComplete,
    success: requestSuccess,
    error: requestError
});

function data(parameters) {
    var dictionary = {};
    var pairs = parameters.split('&');
    for (var i = 0; i < pairs.length; i++) {
        var keyValuePair = pairs[i].split('=');
        dictionary[keyValuePair[0]] = keyValuePair[1];
    }
    return dictionary;
}

function requestBefore() {
    container.find('.message.error').hide();
    container.prepend('<div class="modal"><div class="indicator">Loading...</div></div>');
}

function requestComplete() {
    container.find('.modal').remove();
}

function requestSuccess(response) {
    container.empty();
    container.html(response);
}

function requestError(response) {
    if (response.status == 200 && response.responseText == 'OK') {
        requestSuccess(response);
    } else {
        container.find('.message.error').fadeIn('slow');
    }
}

Все это выполняется в $ (document) .ready (function () {});

Cheers, Jim

@ Oleg - запрошена дополнительная информация, пример ответа, который может получить ajax-вызов.

<p class="message error hidden">An unknown error occured while trying to
retrieve data, please try again shortly.</p>
<div class="timeline">
   <a class="icon shuttle-previous"
rel="max_id=16470650733&page=1&q=something">Newer Data</a>
   <a class="icon shuttle-next"
rel="max_id=16470650733&page=3&q=something">Older Data</a>
</div>
<ol class="social">
   <li class="even">
       <div class="avatar">
           <img src="sphere_normal.gif"/>
       </div>
       <p>
           Some Content<br/>
           <span class="published">Jun 18, 2010 11:29:05 AM</span> - <a
target="_blank" href="">Direct Link</a>
       </p>
   </li>
   <li class="odd">
       <div class="avatar">
           <img src="sphere_normal.gif"/>
       </div>
       <p>
           Some Content<br/>
           <span class="published">Jun 18, 2010 11:29:05 AM</span> - <a
target="_blank" href="">Direct Link</a>
       </p>
   </li>
</ol>
<div class="timeline">
   <a class="icon shuttle-previous"
rel="max_id=16470650733&page=1&q=something">Newer Data</a>
   <a class="icon shuttle-next"
rel="max_id=16470650733&page=3&q=something">Older Data</a>
</div>

Ответы [ 3 ]

2 голосов
/ 12 сентября 2010

Я только что решил похожую проблему и подумал, что опубликую свое решение на случай, если оно пригодится кому-то еще.

Только Firefox и Chrome показывали пустой ajax-ответ, так что это казалось междоменной проблемой, но все было в одном домене.

Оказалось, что виноват «www.», Который я излишне и тупо запрограммировал в своем URL-адресе ajax. Если бы я использовал относительный путь, все было бы хорошо.

У меня был тестовый сайт, открытый в тот момент как "http://domain.com", без 'www.', Поэтому Firefox и Chrome обрабатывали его как другой домен. Переход к" http://www.domain.com" привел к вызов ajax работает во всех браузерах.

Итак, учитывая, что вы написали:

url: '/ path / to / local / url'

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

1 голос
/ 17 октября 2010

Chrome встал на ноги с безопасностью локальных файлов, поэтому нет локальных файлов AJAXing с относительными путями: http://code.google.com/p/chromium/issues/detail?id=47416

1 голос
/ 22 июня 2010

Я взял ваш исходный код и настроил сценарий быстрого тестирования, но не смог воспроизвести вашу проблему. У меня это отлично работает как в Firefox (3.6.3), так и в Chrome (5.0.375.70). Я пробовал это как локально, так и на удаленном сервере.

Так что ваш код, скорее всего, не виноват. Но я также думаю, что это вообще не проблема, связанная с Chrome.

Другие люди , похоже, уже сталкивались с этим. Изменение типа контента не повлияло на мой тестовый сценарий. Это даже работает, когда я устанавливаю Content-Type на image/jpeg.

На форумах JQuery кто-то указал разное поведение в зависимости от того, запускает ли приложение свое приложение локально или на удаленном сервере. Если это так, вы можете сравнить HTTP-запрос и заголовки ответа, чтобы отследить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...