Исправление междоменных запросов в 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 ответа

Для выполнения междоменных запросов вам, вероятно, потребуется проверить следующее

  1. jQuery.support.cors = true;
  2. crossDomain = true;
  3. Заголовки 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
    • Протокол должен быть по той же схеме, что и вызывающая страница
  • Всегда асинхронный

Похоже, вы проверяете на соответствие протоколам, поэтому вы должны быть там.

Другие вопросы по тегам