Исправление междоменных запросов в IE8
Я пытаюсь изменить существующий код, который ломается в IE8. Из того, что я читал в Интернете, это распространенная проблема, связанная с XDomainRequest и XMLHttpRequest.
Раньше я не работал с AJAX таким образом, поэтому я совершенно не понимаю, что делать здесь. Код выглядит следующим образом: (я заменил конфиденциальную информацию в скобках "[[" и "]]" на произвольные имена переменных, чтобы определить, где используется каждая из них):
jQuery(document).ready(function() {
var base_url = '[[BASE_URL_1]]'; // DTRT for ajax requests (CORS over HTTP by default)
if (document.location.protocol == "https:") {
base_url = '[[BASE_URL_2]]'; // The proxy script that lets us do secure cross-domain AJAX requests
}
var classSpec = '$class_spec';
$('#[[ID_1]]').empty().addClass('loading'); // loading gif
$('#[[ID_2]]').empty().addClass('loading');
$.ajax( {
type: "GET",
url: base_url + '[[URL_1]]' + classSpec + '[[URL_2]]',
success: function (data) { $('[[ID_2]]').html(data).removeClass('loading'); }
} );
$.ajax( {
type: "GET",
url: base_url + '[[URL_1]' + classSpec + '[[URL_3]]',
success: function (data) { $('[[ID+1]]').html(data).removeClass('loading'); initialize(); }
} );
});
Как я могу изменить этот код, чтобы включить поддержку IE8?
2 ответа
Для выполнения междоменных запросов вам, вероятно, потребуется проверить следующее
- jQuery.support.cors = true;
- crossDomain = true;
- Заголовки Access-Control-Allow-Origin
1 & 2
jQuery(document).ready(function() {
var base_url = '[[BASE_URL_1]]'; // DTRT for ajax requests (CORS over HTTP by default)
if (document.location.protocol == "https:") {
base_url = '[[BASE_URL_2]]'; // The proxy script that lets us do secure cross-domain AJAX requests
}
var classSpec = '$class_spec';
$('#[[ID_1]]').empty().addClass('loading'); // loading gif
$('#[[ID_2]]').empty().addClass('loading');
jQuery.support.cors = true;
$.ajax(
{
crossDomain: true,
type: "GET",
url: base_url + '[[URL_1]]' + classSpec + '[[URL_2]]',
success: function (data) { $('[[ID_2]]').html(data).removeClass('loading'); }
} );
$.ajax(
{
crossDomain: true,
type: "GET",
url: base_url + '[[URL_1]' + classSpec + '[[URL_3]]',
success: function (data) { $('[[ID+1]]').html(data).removeClass('loading'); initialize(); }
} );
});
3) На самом деле требует от вас доступа к серверу, с которым вы хотите поговорить. В основном удаленный сервер говорит браузеру: эй, я разрешаю этим доменам делать запросы XDR, если вы не один из них... пожалуйста, не отправляйте их. (лично это самый сумасшедший сценарий безопасности, который я когда-либо видел... так как именно запросчик должен воздерживаться от запросов к доменам, которые не хотят получать запросы от него. Это действительно звучит безопасно, хейн!).
Так что, если вы находитесь на сервере site1.com и хотите отправить XDR на site2.com, то site2.com должен вернуть заголовок, например
Access-Control-Allow-Origin: *
или же
Access-Control-Allow-Origin: site1.com
При работе с серверами IIS вам, вероятно, также потребуется указать: Access-Control-Allow-Methods
Вышеуказанное обычно относится ко ВСЕМ браузерам, а не только к IE8, особенности IE8 можно посмотреть здесь: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
Я рекомендую попробовать эту библиотеку: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest которая
Реализует автоматическую поддержку перекрестного общего доступа к ресурсам с использованием объекта XDomainRequest для IE8 и IE9 при использовании функции $.ajax в jQuery 1.5+".
Он имеет те же ограничения, что и XDomainRequest, а именно:
Чтобы использовать XDomainRequest в Internet Explorer, запрос должен быть:
- Только ПОЛУЧИТЬ или ПОСТ
- При отправке сообщений данные всегда отправляются с типом содержимого text/plain
- Только HTTP или HTTPS
- Протокол должен быть по той же схеме, что и вызывающая страница
- Всегда асинхронный
Похоже, вы проверяете на соответствие протоколам, поэтому вы должны быть там.