IE9 JQuery.ajax выдает загадочную ошибку - PullRequest
1 голос
/ 21 декабря 2011

Я испытываю трудную ошибку ajax в IE9. Я заранее скажу, что это технически не междоменный запрос, поэтому я уверен, что это не проблема.

Редактировать : Похоже, что проблема может быть связана с запросом того же домена, который рассматривается как междоменный, хотя неясно, почему (см. Комментарии).

Я использую локальный прокси-сервер для выполнения междоменных запросов Ajax, и URL-адрес, который я использую, выглядит следующим образом http://localhost/proxy/?target=..... Все хорошие браузеры довольны этим, но IE немедленно возвращает ошибку до того, как запрос будет отправлен (у меня есть проверил это, используя сетевой захват Fiddler и инструментов разработчика IE).

Когда я проверяю объект ошибки, переданный обратному вызову JQuery ajax.error, его функция isRejected() возвращает true, но я не могу выяснить, что может привести к отклонению запроса. ReadyState объекта ошибки - 4 (подразумевается, что запрос завершен?), Status - 0, а statusText - «error».

Я строю свой запрос примерно так:

$.ajax(url, {
    data: {...list of parameters...},
    dataType: 'json',
    type: 'GET',
    success: function() { ... },
    error: function() { ... },
    beforeSend: proxy.beforeRequestSend,
    timeout: 35000
});

Функция proxy.beforeRequestSend выглядит следующим образом:

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    // I've also tried using the full url (http://localhost/proxy/?...)
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
  }
};

Кто-нибудь знает, что может вызвать полный сбой запроса в IE9? К сожалению, у меня нет доступа к IE8 или 7 для тестирования, но я предполагаю, что они будут вести себя одинаково. Тот факт, что обработчик ошибок JQuery ajax вызывается, говорит о том, что ошибка возникает не во время создания запроса, а когда он предположительно выполняется. Все остальные браузеры, работающие правильно, говорят мне, что основные принципы верны.

Ранее я читал, что в JQuery / IE есть проблемы с кодировкой url некоторых символов, но если я предупреждаю settings.url в конце функции beforeSend, целевой URL корректно закодирован (это также говорит мне, что that.proxyRequired(settings.url) возвращает true).

Любой вклад очень ценится.

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

В вашем javascript перед вызовом $ .ajax (или эквивалентного) принудительного междоменного поведения:

JQuery.support.cors=true;
1 голос
/ 31 декабря 2011

Как вы можете видеть в коде моего вопроса, я добавляю URL прокси в обратном вызове beforeSend функции JQuery.ajax (proxy.beforeRequestSend). Ко времени выполнения этой функции JQuery уже проверил запрос и решил, что он междоменный.

В результате JQuery обрабатывал все мои запросы как междоменные, хотя они все отправлялись на локальный прокси. Затем JQuery отклонил любой междоменный запрос в IE и Opera, потому что они не поддерживают CORS.

К счастью, свойство crossDomain передается обратному вызову beforeSend в объекте settings и легко изменяется.

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url);
    settings.crossDomain = false;
  }
};
1 голос
/ 21 декабря 2011

Отправляет ли ваш прокси-сервер перенаправление в ответ на вызов ajax? Браузеры молча следят за перенаправлениями, и это может быть причиной того, что XHR обнаруживает попытку XSS. Поскольку jQuery не поддерживает CORS в IE9, у вас остается ошибка.

См. Этот другой вопрос Stackoverflow: Запросы Ajax из разных источников не работают в Opera и IE9?

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