Объяснить создание 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. Надеюсь, это поможет.