Объяснить создание XMLHttpRequest

Я изучаю XMLHttpRequest из w3schools. Я не понимаю следующий фрагмент кода. Что означает window.XMLHttpRequest? Что делает его истинным или ложным? Является ли эта целая структура if/else только для учета ie6 и ie5, и если да, то все это можно заменить одной строкой, которая читает xmlhttp = new XMLHttpRequest()?

 if (window.XMLHttpRequest) {
     // code for IE7+, Firefox, Chrome, Opera, Safari
     xmlhttp = new XMLHttpRequest();
 } else {
     // code for IE6, IE5
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }

Ответ 1

Да, я согласен с harschware, если у вас есть кросс-браузерный инструмент, потому что это сложное поле.

Вышеприведенный код представляет собой фрагмент кода кросс-браузера, который создает объект XMLHTTPRequest.

Он хорошо структурирован, потому что он использует проверку функциональности, а не проверку браузера. См. Эту статью "Обнаружение функции, а не обнаружение браузера" по адресу: http://www.javascripttoolbox.com/bestpractices/

Итак, это:

if (window.XMLHttpRequest)

- определяет, имеет ли браузер функциональность XMLHttpRequest, реализованную как глобальная функция (члены объекта окна), если так объект XMLHttpRequest построен таким образом.

В противном случае код слепо предполагает, что он может создать XMLHttpRequest, вызывая функции ActiveXObject, что позволяет создать такой объект в IE5 и IE6, как указано.

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

Ответ 2

Резюме

... в if (window.XMLHttpRequest) { ... } оценивается только при поддержке стандарта XHR. Else, ActiveX используется для поддержки IE5-6.

Чтобы проверить, поддерживается ли XMLHttpRequest API спецификация проверьте, существует ли глобальный объект XMLHttpRequest, Поскольку window - глобальный объект, просто проверяющий существование свойства window.XMLHttpRequest. {1}

Это показано ниже, ! - это логический оператор NOT, используемый для отображения результата внутри if (window.XMLHttpRequest).

    if (window.XMLHttpRequest)
    // Supported:
    !!window.XMLHttpRequest === !![object XMLHttpRequest] === !false === true
    // Not supported, so the property does not exist, and is undefined
    !!window.XMLHttpRequest === !!undefined               === !true  === false

Но это не конец истории. Концепция XHR берет начало от Microsoft, который первым реализовал ее в своем браузере через ActiveXObject: Internet Explorer 5.0. Позже, в версии 7.0, Microsoft добавила поддержку стандартизованного XHR API.

Никто больше не заботится о IE5. Тем не менее, по-прежнему существует значительное число пользователей IE6 (около 1%). Таким образом, не мешает также поддерживать IE5-6 через:

... } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }


{1}: Другие методы для рассмотрения:
  • if (typeof window.XMLHttpRequest !== 'undefined') - Это также сработает.
  • if (XMLHttpRequest) - не следует использовать. Когда переменная не существует (= не объявлена), ReferenceError: XMLHttpRequest undefined `выбрано

Ответ 3

История XMLHTTP поделилась интересной историей о XMLHTTP и XMLHttpRequest. Короче говоря, XMLHTTP был представлен Microsoft как объект ActiveX, вам нужно создать его с помощью new ActiveXObject("Microsoft.XMLHTTP") или new ActiveXObject("MSXML2.XMLHTTP.6.0"), см. Использование правильной версии MSXML в Internet Explorer. Позже другие поставщики браузеров нашли этот компонент полезным и работали с W3C, чтобы стандартизировать его в имени XMLHttpRequest, который является родным объектом объекта window, и может быть создан с помощью new XMLHttpRequest(). Однако, поскольку не все браузеры поддерживают объект XMLHttpRequest, например. IE6 и IE5, обычной практикой является обнаружение того, является ли объект XMLHttpRequest допустимым объектом объекта window через if (window.XMLHttpRequest) - если да, то создайте его с помощью new, иначе попробуйте вернуться к XMLHTTP ActiveX. Надеюсь, это поможет.