| Internet Explorer 8: XDomainRequest
 
 ВведениеНовый Internet Explorer 8 (IE8) принес с собой одно приятное нововведение, призванное, как когда-то это сделал XMLHttpRequest, облегчить жизнь программистам и дать бОльшие возможности для взаимодействия с пользователем. Напомню, что XMLHttpRequest может работать при условии, что запрашиваемый документ и страница, с которой направлен запрос, должны быть в одном домене. Например, //www.landgraph.ru/test/test_xml.html - страницы с кодом запроса XMLHttpRequest и //www.landgraph.ru/test/test_xml.xml - запрашиваемый XML файл. Новой «фишкой» восьмой версии IE8 является интерфейс XDomainRequest (IHTMLXDomainRequest), с помощью которого, в отличие от XMLHttpRequest, можно делать запросы к различным доменам. Другими словами, страница с кодом XDomainRequest может находиться по адресу //www.landgraph.ru/test/test.html, а запрашиваемая страница – //www.google.com/. Описание XDomainRequestРассмотрим структуру интерфейса. Основные элементы интерфейса, необходимые для работы, отмечены жирным шрифтом. СвойстваКаждый объект XDomainRequest имеет следующие свойства: 
| Свойство | Описание |  
| contentType | Свойство доступно для чтения и записи, определяет тип данных как полученных, так и передаваемых данных |  
| responseText | Свойство доступно для чтения и содержит данные, полученные от сервера в текстовом виде |  
| timeout | Свойство доступно для чтения и записи, содержит значение времени ожидания ответа сервера | 
 СобытияОбъект XDomainRequest может порождать следующие события: 
| Событие | Описание |  
| onerror | Событие происходит, когда во время запроса произошла какая-то ошибка, кроме превышения времени ожидания ответа (см. ниже). Точнее узнать род ошибки пока не возможно. |  
| onload | Событие происходит, когда полностью получен ответ от сервера |  
| onprogress | Событие происходит, когда браузер начинает получение данных от сервера |  
| ontimeot | Событие происходит, когда превышено время ожидания ответа от сервера | 
 МетодыВсе объекты XDomainRequest обладают следующим набором методов: 
| Метод | Описание |  
| open | Метод создает соединение с доменом Синтаксис:
 object.open(Method, URL)
 Method – строка “GET” или “POST”, в зависимости от метода передачи данных серверу, обязательный аргумент
 URL – адрес документа на сервере, обязательный аргумент
 |  
| send | Метод отсылает запрос (с данными или без них) и начинает процесс приема данных с сервера Синтаксис:
 object.send([Data])
 Data – данные, которые необходимо передать на сервер, не обязательный аргумент
 |  
| abort | Метод прерывает выполнение метода send Синтаксис:
 object.abort()
 | 
 ИспользованиеОтправка запросаТеперь перейдем к программированию. Все примеры написаны на языке JavaScript. Проверить наличие XDomainRequest можно просто: 
| 
if(window.XDomainRequest) {
//Действия при наличии интерфейса
} else {
//Действия при отсутствии интерфейса
}
 | 
 В принципе, все точно так же, как и при работе с XMLHttpRequest. Создать объект интерфейса можно с помощью следующего кода: 
| 
var xdr = new window.XDomainRequest;
 | 
 Теперь необходимо открыть соединение с сервером. Сделать это можно с помощью метода open: 
| 
xdr.open("get", "//www.landgraph.ru/test/test_xdr.php");
 | 
 В данном случае мы указываем метод GET передачи запроса. Далее следует отослать запрос с помощью метода send: 
| 
xdr.send("какие-то данные");
 | 
 При этом, мы можем и не передавать данные, а вызвать метод без параметров: Всё. На этом передача данных завершается. Итого у нас получился следующий код: 
| 
if(window.XDomainRequest) {
var xdr = new window.XDomainRequest;
xdr.open("get", "//www.landgraph.ru/test/test_xdr.php");
xdr.send();
} else {
alert("XDomainRequest отсутствует!");
}
 | 
 Получение данныхПрактически всегда необходимо также получить данные от сервера. Сделать это можно, если установить обработчик события onload объекта. Напомню, что событие onload происходит, когда данные от сервера получены в полном объеме. 
| 
xdr.onload=xdrLoad;
...
function xdrLoad()
{
var data=xdr.responseText;
//Выполнение действий с полученными данными
}
 | 
 Например, следующий код выводит полученные данные в виде сообщения: 
| 
if(window.XDomainRequest) {
var xdr = new window.XDomainRequest;
xdr.onload=xdrLoad;
xdr.open("get", "//www.landgraph.ru/test/test_xdr.php");
xdr.send();
} else {
alert("XDomainRequest отсутствует!");
}
function xdrLoad()
{
var data=xdr.responseText;
alert("Приняты данные следующего содержания:rn"+data);
}
 | 
 Обработка ошибокНе секрет, во время работы происходят те или иные ошибки. И лучше пользователю либо узнать об их появлении, либо обработать самостоятельно. Пока что мы можем обработать только два вида ошибок: превышение времени ожидания ответа сервера и все остальные ошибки. Первые обрабатываются через событие ontimeout, вторые через событие onerror. Пример: 
| 
if(window.XDomainRequest) {
var xdr = new window.XDomainRequest;
xdr.onerror=xdrError;
xdr.onerror=xdrTimeOut;
xdr.open("get", "//www.landgraph.ru/test/test_xdr.php");
xdr.send();
} else {
alert("XDomainRequest отсутствует!");
}
function xdrError()
{
alert("Во время выполнения запроса произошла ошибка!");
}
function xdrTimeOut()
{
alert("Истекло время ожидания ответа сервера, попробуйте еще раз!");
}
 | 
 Требования к серверуПри использовании интерфейса XDomainRequest, веб-серверу направляется запрос, в заголовке которого присутствует поле XDomainRequest: 1 При получении подобного запроса, сервер обязательно должен установить поле заголовка ответа XDomainRequestAllowed: 1 Иначе пользователь получит сообщение об ошибке! Ниже пример рабочего скрипта PHP, с помощью которого вы всегда можете проверить работоспособность своего детища. Для тестирования вы также можете воспользоваться страницей, постоянно расположеной по адресу //www.landgraph.ru/test/test_xdr.php. 
| 
<?php
//Если к нам приходит запрос от XDomainRequest
if($_SERVER['HTTP_XDOMAINREQUEST']=='1') {
//Отвечаем клиенту, что мы поддерживаем XDomainRequest
header('XDomainRequestAllowed: 1');
echo "XDomainRequest works!";
} else {
//Если страница запрошена не через XDomainRequest
echo "XDomainRequest dont work!";
}
?>
 | 
 ОграниченияКак и везде, из соображений безопасности, есть ограничения. При использовании XDomainRequest протокол страницы, с которой идет запрос, и протокол загружаемой страницы должны быть идентичны. Другими словами, если вы открываете сохраненный на вашем локальном компьютере документ, то его протокол – file://, а внутри документа есть запрос к странице в Интернете по протоколу //, то этот запрос не будет выполнен. Следующая таблица показывает, какие возможны комбинации страниц, с которых разрешен доступ с помощью интерфейса XDomainRequest в другие зоны безопасности. 
| Откуда  Куда | Локально | Интранет | Доверенный(Интранет) | Доверенный(Интернет) | Интернет | Ограниченный |  
| Локально | Разрешено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |  
| Интранет | Запрещено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |  
| Доверенный(Интранет) | Запрещено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |  
| Доверенный(Интернет) | Запрещено | Запрещено | Запрещено | Разрешено | Разрешено | Запрещено |  
| Интернет | Запрещено | Запрещено | Запрещено | Разрешено | Разрешено | Запрещено |  
| Ограниченный | Запрещено | Запрещено | Запрещено | Запрещено | Запрещено | Запрещено | 
 Из таблицы видно, что страницы, расположенные локально (//localhost/) имеют выход на все узлы, кроме ограниченных политикой безопасности. Как видите, через Интернет могут взаимодействовать любые узлы, кроме ограниченных текущей политикой безопасности. 
 
 
 
 |