Internet Explorer 8: XDomainRequest
Раздел:
Programming /
Вебмастеру
@
02.07.2008 |
Ключевые слова: Internet Explorer 8 XMLHttpRequest DOM
Автор: Landgraph
Источник: CodeNet
Введение
Новый Internet Explorer 8 (IE8) принес с собой одно приятное нововведение, призванное, как когда-то это сделал XMLHttpRequest, облегчить жизнь программистам и дать бОльшие возможности для взаимодействия с пользователем.
Напомню, что XMLHttpRequest может работать при условии, что запрашиваемый документ и страница, с которой направлен запрос, должны быть в одном домене. Например, http://www.landgraph.ru/test/test_xml.html - страницы с кодом запроса XMLHttpRequest и http://www.landgraph.ru/test/test_xml.xml - запрашиваемый XML файл.
Новой "фишкой" восьмой версии IE8 является интерфейс XDomainRequest (IHTMLXDomainRequest), с помощью которого, в отличие от XMLHttpRequest, можно делать запросы к различным доменам. Другими словами, страница с кодом XDomainRequest может находиться по адресу http://www.landgraph.ru/test/test.html, а запрашиваемая страница - http://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", "http://www.landgraph.ru/test/test_xdr.php");
В данном случае мы указываем метод GET передачи запроса. Далее следует отослать запрос с помощью метода send:
xdr.send("какие-то данные");
При этом, мы можем и не передавать данные, а вызвать метод без параметров:
xdr.send();
Всё. На этом передача данных завершается. Итого у нас получился следующий код:
if(window.XDomainRequest) {
var xdr = new window.XDomainRequest;
xdr.open("get", "http://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", "http://www.landgraph.ru/test/test_xdr.php");
xdr.send();
}
else {
alert("XDomainRequest отсутствует!");
}
function xdrLoad() {
var data=xdr.responseText;
alert("Приняты данные следующего содержания:\r\n"+data);
}
Обработка ошибок
Не секрет, во время работы происходят те или иные ошибки. И лучше пользователю либо узнать об их появлении, либо обработать самостоятельно. Пока что мы можем обработать только два вида ошибок: превышение времени ожидания ответа сервера и все остальные ошибки. Первые обрабатываются через событие ontimeout, вторые через событие onerror. Пример:
if(window.XDomainRequest) {
var xdr = new window.XDomainRequest;
xdr.onerror=xdrError;
xdr.onerror=xdrTimeOut;
xdr.open("get", "http://www.landgraph.ru/test/test_xdr.php");
xdr.send();
}
else {
alert("XDomainRequest отсутствует!");
}
function xdrError() {
alert("Во время выполнения запроса произошла ошибка!");
}
function xdrTimeOut() {
alert("Истекло время ожидания ответа сервера, попробуйте еще раз!");
}
Требования к серверу
При использовании интерфейса XDomainRequest, веб-серверу направляется запрос, в заголовке которого присутствует поле
XDomainRequest: 1
При получении подобного запроса, сервер обязательно должен установить поле заголовка ответа
XDomainRequestAllowed: 1
Иначе пользователь получит сообщение об ошибке! Ниже пример рабочего скрипта PHP, с помощью которого вы всегда можете проверить работоспособность своего детища. Для тестирования вы также можете воспользоваться страницей, постоянно расположеной по адресу http://www.landgraph.ru/test/test_xdr.php.
Ограничения
Как и везде, из соображений безопасности, есть ограничения. При использовании XDomainRequest протокол страницы, с которой идет запрос, и протокол загружаемой страницы должны быть идентичны. Другими словами, если вы открываете сохраненный на вашем локальном компьютере документ, то его протокол - file://, а внутри документа есть запрос к странице в Интернете по протоколу http://, то этот запрос не будет выполнен.
Следующая таблица показывает, какие возможны комбинации страниц, с которых разрешен доступ с помощью интерфейса XDomainRequest в другие зоны безопасности.
Откуда \ Куда | Локально | Интранет | Доверенный (Интранет) | Доверенный (Интернет) | Интернет | Ограниченный |
Локально |
Разрешено |
Разрешено |
Разрешено |
Разрешено |
Разрешено |
Запрещено |
Интранет |
Запрещено |
Разрешено |
Разрешено |
Разрешено |
Разрешено |
Запрещено |
Доверенный (Интранет) |
Запрещено |
Разрешено |
Разрешено |
Разрешено |
Разрешено |
Запрещено |
Доверенный (Интернет) |
Запрещено |
Запрещено |
Запрещено |
Разрешено |
Разрешено |
Запрещено |
Интернет |
Запрещено |
Запрещено |
Запрещено |
Разрешено |
Разрешено |
Запрещено |
Ограниченный |
Запрещено |
Запрещено |
Запрещено |
Запрещено |
Запрещено |
Запрещено |
Из таблицы видно, что страницы, расположенные локально (http://localhost/) имеют выход на все узлы, кроме ограниченных политикой безопасности. Как видите, через Интернет могут взаимодействовать любые узлы, кроме ограниченных текущей политикой безопасности.
Это интересно:
Распечатать статью
Вернуться в раздел:
Programming /
Вебмастеру
Реклама: