В главе 20 было показано, как с помощью объекта XMLHttpRequest выполнить HTTP_запрос с целью загрузки текстового документа. В случае XML_документов свойство responseXML будет ссылаться на преобразованное представление доку_ мента в виде DOM_объекта Document. Несмотря на то, что объект XMLHttpRequest не стандартизован, он получил широкое распространение и, как правило, пред_ ставляет собой наилучшее средство загрузки XML_документов.
Однако существует и другой способ. XML_объект Document, созданный способом, описанным в примере 21.1, может загружать и анализировать XML_документы, используя для этого менее известный прием. Пример 21.2 демонстрирует, как это делается. Что самое удивительное, в IE и броузерах, основанных на Mozilla, применяется один и тот же программный код.
Пример 21.2. Синхронная загрузка XML'документа
/**
* Синхронно загружает XML_документ с заданного URL_адреса
* и возвращает его в виде объекта Document
*/
21.1. Получение XML*документов
XML.load = function(url) {
// Создать пустой документ с помощью функции, определенной ранее
Подобно объекту XMLHttpRequest, представленный здесь метод load() не является стандартным. Он имеет несколько существенных отличий от XMLHttpRequest. Во_ первых, он работает только с XML_документами, тогда как XMLHttpRequest может применяться для загрузки текстовых документов любого типа. Во_вторых, он не ограничен протоколом HTTP. В частности, он способен читать файлы из локаль_ ной файловой системы, что бывает удобно в процессе разработки и отладки веб_ приложения. В_третьих, когда задействован протокол HTTP, метод load() гене_ рирует запросы GET и не может использоваться для передачи данных веб_серве_ ру методом POST.
Подобно XMLHttpRequest, метод load() может работать в асинхронном режиме. Фактически этот режим используется по умолчанию, если в свойство async явно не будет записано значение false. В примере 21.3 приводится асинхронная вер_ сия метода XML.load().
Пример 21.3. Асинхронная загрузка XML'документа
/**
* Асинхронно загружает и анализирует XML_документ с заданного URL_адреса.
* Как только документ будет готов, он передается указанной функции обратного вызова.
* Данная функция сразу же возвращает управление и не имеет возвращаемого значения. */
XML.loadAsync = function(url, callback) { var xmldoc = XML.newDocument();
// Если XML_документ создан методом createDocument, использовать
// onload для определения момента, когда он будет загружен
if (document.implementation && document.implementation.createDocument){ xmldoc.onload = function() { callback(xmldoc); };
}
// В противном случае использовать onreadystatechange, как
// и в случае с объектом XMLHttpRequest
else {
xmldoc.onreadystatechange = function() {
if (xmldoc.readyState == 4) callback(xmldoc);
};
}
// Начать загрузку и анализ документа xmldoc.load(url);