Лабораторная работа: Создание приложений на AJAX
*/
function getReadyStateHandler(req, responseXmlHandler) {
// Возвращает неопределенную функцию, которая считывает
// данные XMLHttpRequest return function () {
// Если требуется статус "закончен"
if (req. readyState == 4) {
// Проверяем, пришел ли успешный ответ сервера
if (req. status == 200) {
// Передает XML оператору
responseXmlHandler(req. responseXML);
} else {
// Возникла ошибка HTTP
alert("HTTP error: "+req. status);
}
}
}
}
О getReadyStateHandler()
getReadyStateHandler() - относительно сложный кусок кода, особенно если вы ранее не знали JavaScript. Но с другой стороны преимущество в том, что с помощью включения этой функции в вашу библиотеку JavaScript вы можете спокойно обрабатывать Ajax-запросы сервера без работы с данными XMLHttpRequest. Важно также, что вы понимаете, как использовать getReadyStateHandler() в вашем собственном коде.
В листинге 3 вы видели getReadyStateHandler(), вызванный так: handlerFunction = getReadyStateHandler(req, updateCart). Функция, возвращаемая с помощью getReadyStateHandler(), в этом случае проверит, выполнен ли XMLHttpRequest в переменной req и затем вызовет функцию, называющуюся updateCart, с помощью запроса в формате XML.
Данные корзины
Листинг 7 - собственно сам код updateCart(). Функция запрашивает XML-документ корзины покупателя, используя DOM-вызовы и обновляя Web-страницу (см. листинг 1) для того, чтобы показать новые элементы содержимого новой корзины. Обратите здесь внимание на вызовы, использованные для того, чтобы достать данные из XMLDOM. Атрибут generated элемента cart, созданный, когда Cart был сериализован в формате XML, проверяется, чтобы удостовериться, что более новые данные корзины не перезаписаны более старыми данными. Ajax-запросы по своей сути асинхронны, поэтому эта проверка предохраняет против ответов сервера, которые прибывают в беспорядке.
Листинг 7. Обновление страницы с отображением XML документа корзины
functionupdateCart(cartXML) {
// Получить корневой " cart" элемент из документа
varcart = cartXML. getElementsByTagName("cart") [0] ;
// Проверим, что более ранний документ корзины не был обработан еще
var generated = cart. getAttribute("generated");
if (generated > lastCartUpdate) {
lastCartUpdate = generated;