Статьи Новости Контакты

17.04.2007
Николай Байбородин

Ajax и браузеры: проверка совместимости

Проверка используемого браузером объекта XMLHTTPRequest

Совместимость программного кода веб-страницы с различными браузерами – одна из основных задач, стоящих перед разработчиком. Вы должны быть уверены, что AJAX-движок вашего сайта формирует структуру данных, передаваемых клиенту именно таким образом, которым браузер клиента ожидает их получить.

XMLHttpRequest, Microsoft.XMLHTTP, Msxml12.XMLHTTP — разные объекты, выполняющие одинаковые функции
Для формирования AJAX-приложением HTTP- запроса используются стандартные инструменты языка Java Script, реализация которого, как известно, в различных браузерах имеет свои особенности. В браузерах Firefox и Opera объект Java Script, отвечающий за отправку запросов веб-серверу, называется XMLHttpRequest. В то же время, начиная с версии IE 5.0, в браузерах Internet Explorer имеется такой компонент Active X, как Microsoft.XMLHTTP (или Msxml12.XMLHTTP), выполняющий, как нетрудно догадаться, те же функции. В результате мы имеем ситуацию, при которой программный код, формирующий запрос к веб-серверу, ориентированному на браузер Firefox, не будет работать в браузере Internet Explorer, и наоборот. На самом деле даже в том случае, если вы будете ориентироваться только на пользователей браузера IE, задача не становится проще, и вот почему: как уже упоминалось немного выше, имеются две реализации компонента Active X, формирующего HTTP-запрос, – Microsoft.XMLHTTP и Msxml12.XMLHTTP. Очевидно, что это разные версии компонента. Но, что более важно, далеко не очевидно то, что данные компоненты от одного и того же производителя несовместимы друг с другом. Под несовместимостью понимается то, что в системе с установленным компонентом Microsoft.XMLHTTP программный код, ссылающийся на компонент Msxml12.XMLHTTP, при попытке его выполнения сгенерирует ошибку. Не вдаваясь в подробности особенностей использования того или иного компонента, можно сказать, что при использовании компонента Microsoft.XMLHTTP оболочка, в которую он помещен – ActiveXObject, – будет пытаться использовать наиболее последнюю из известных ей версий объекта, соответствующих данной версии браузера. Теоретически таким объектом должен оказаться объект, входящий в состав MSXML 2.0 (Microsoft XML Core Services). Но MSXML 2.0 включен в поставку IE, начиная только с шестой версии, которая еще не так сильно распространена, чтобы можно было бы использовать Microsoft.XMLHTTP без оглядки на возможные неприятные последствия. Если вы используете компонент Msxml12.XMLHTTP, это является сигналом для ActiveXObject использовать MSXML версии не старше 1.0.

Несмотря на то что Microsoft и сообщество разработчиков открытого проекта Mozilla выбрали разные пути реализации объекта, формирующего запрос на получение XML-данных с веб-сервера, все-таки есть способ создать универсальный AJAX-код, корректно работающий в различных браузерах.

Итак, первое, что необходимо сделать при использовании элементов технологии AJAX на веб-странице, это проверить, какой вид объекта, реализующего формирование запроса, используется браузером клиента, а затем должным образом инициализировать этот объект. Напишем функцию, реализующую выполнение поставленной задачи.

if (window.XMLHttpRequest){
#nbsprequest = new XMLHttpRequest();
#nbsprequest.onreadystatechange=handleResponse;
#nbsprequest.open("GET",theURL,true);
#nbsprequest.send(null);
}

Если браузер поддерживает объект XMLHttpRequest, тогда:
1) условие if (window.XMLHttpRequest) возвращает значение true;
2) создается новый объект XMLHttpRequest;
3) в качестве слушателя-обработчика событий данного объекта используется стандартная функция Java Script – handleResponse();
4) вызываются методы open() и send() созданного объекта.

Фильтр из условных операторов поможет определить используемую браузером модель формирования HML-запросов
Осталось добавить проверку на использование объектов Microsoft.XMLHTTP и Msxml12.XMLHTTP. В случае использования клиентом браузера IE объект XMLHttpRequest уже не будет существовать и выражение if (window.XMLHttpRequest) возвратит значение false. Остается выполнить еще пару проверок:

else if (window.ActiveXObject){
request=new ActiveXObject("Microsoft.XMLHTTP");
if (! request){
request=new ActiveXObject("Msxml2.XMLHTTP");
}
if(request){
request.onreadystatechange=handleResponse;
request.open(reqType,url,true);
request.send(null);
}
}

Этот фрагмент кода проверяет наличие объекта ActiveXObject, который свидетельствует об использовании браузера Internet Explorer. Сам же запрос может выполняться с использованием одного из двух ActiveX-компонентов — Microsoft.XMLHTTP и Msxml12.XMLHTTP.

Конечно, помимо этих основных разновидностей объекта, осуществляющего XML-запрос через HTTP, есть и другие. Однако в большинстве случаев приходится иметь дело именно с только приведенными тремя. Но в случае необходимости аналогичным образом можно добавить проверку и на остальные версии.

Определив используемый объект HML-запросов, можно разворачивать Ajax-приложение, не волнуясь за совместимость с разными версиями браузеров
Пройдя через фильтр, состоящий из конструкций if(), и получив на выходе значение true, можно, в соответствии с конкретной версией браузера клиента, приступать к формированию XML-запроса в стиле AJAX.

В готовом виде процедура проверки версии библиотеки XMLRequest выглядит следующим образом.

function httpRequest(reqType,url,asynch){

if(window.XMLHttpRequest){
request = new XMLHttpRequest( );
} else if (window.ActiveXObject){
request=new ActiveXObject("Msxml2.XMLHTTP");
if (! request){
request=new ActiveXObject("Microsoft.XMLHTTP");
}
}

if(request){
initReq(reqType,url,asynch);
} else {
alert("Your browser does not permit the use of all "+
"of this application's features!");
}
}

function initReq(reqType,url,bool){

request.onreadystatechange=handleResponse;
request.open(reqType,url,bool);
request.send(null);
}




Скоро на сайте

  • Wordpress

    Серия статей о плагинах к движку WordPrress
  • AJAX

    Проекты и продукты, ориентированные на AJAX
  • Новые сервисы Google

    Обзор новых сервисов Google
 

Copyright © 2003—2018 Все права защищены

При использовании материалов сайта ссылка на hostinfo.ru обязательна

  • хостинг от .masterhost
  • Rambler's Top100