Выразительный JavaScript (Хавербеке) - страница 187

Если третьим аргументом >open мы передадим >true, запрос будет асинхронным. Это значит, что при вызове >send запрос ставится в очередь на отправку. Программа продолжает работать, а браузер позаботиться об отправке и получении данных в фоне.

Но пока запрос обрабатывается, мы не получим ответ. Нам нужен механизм оповещения о том, что данные поступили и готовы. Для этого нам нужно будет слушать событие >“load”.

>var req = new XMLHttpRequest();

>req.open("GET", "example/data.txt", true);

>req.addEventListener("load", function() {

>  console.log("Done:", req.status);

>});

>req.send(null);

Так же, как вызов >requestAnimationFrame в главе 15, этот код вынуждает нас использовать асинхронный стиль программирования, оборачивая в функцию тот код, который должен быть выполнен после запроса, и устраивая вызов этой функции в нужное время. Мы вернёмся к этому позже.

Получение данных XML

Когда ресурс, возвращённый объектом >XMLHttpRequest, является документом XML, свойство >responseXML будет содержать разобранное представление о документе. Оно работает схожим с DOM образом, за исключением того, что у него нет присущей HTML функциональности на вроде свойства >style. Объект, содержащийся в >responseXML, соответствует объекту >document. Его свойство >documentElement ссылается на внешний тег документа XML. В следующем документе (example/fruit.xml) таким тегом будет :

>

>  

>  

>  

>

Мы можем получить такой файл следующим образом:

>var req = new XMLHttpRequest();

>req.open("GET", "example/fruit.xml", false);

>req.send(null);

>console.log(req.responseXML.querySelectorAll("fruit").length);

>// → 3

Документы XML можно использовать для обмена с сервером структурированной информацией. Их форма – вложенные теги – хорошо подходит для хранения большинства данных, ну или по крайней мере лучше, чем текстовые файлы. Интерфейс DOM неуклюж в плане извлечения информации, и XML документы получаются довольно многословными. Обычно лучше общаться при помощи данных в формате JSON, которые проще читать и писать – как программам, так и людям.

>var req = new XMLHttpRequest();

>req.open("GET", "example/fruit.json", false);

>req.send(null);

>console.log(JSON.parse(req.responseText));

>// → {banana: "yellow", lemon: "yellow", cherry: "red"}

Песочница для HTTP

HTTP-запросы из веб-страницы вызывают вопросы относительно безопасности. Человек, контролирующий скрипт, может иметь интересы отличные от интересов пользователя, на чьём компьютере он запущен. Конкретно, если я зашёл на сайт themafia.org, я не хочу, чтобы их скрипты могли делать запросы к mybank.com, используя информацию своего браузера в качестве идентификатора, и давая команду отправить все мои деньги на какой-нибудь счёт мафии.