Протокол передачи гипертекста (Hypertext Transfer Protocol, HTTP) определя_ ет, как веб_броузеры должны запрашивать документы, как они должны переда_ вать информацию веб_серверам и как веб_серверы должны отвечать на эти запро_ сы и передачи. Вполне очевидно, что веб_броузеры очень много работают с прото_ колом HTTP. Тем не менее, как правило, сценарии не работают с протоколом HTTP, когда пользователь щелкает по ссылке, отправляет форму или вводит URL в адресной строке. В то же время обычно, хотя и не всегда, JavaScript_код способен работать с протоколом HTTP.
HTTP_запросы могут инициироваться, когда сценарий устанавливает значение свойства location объекта Window или вызывает метод submit() объекта Form. В обо_ их случаях броузер загружает в окно новую страницу, затирая любой исполняв_ шийся сценарий. Такого рода взаимодействие с протоколом HTTP может быть вполне оправданным в веб_страницах, состоящих из нескольких фреймов, но в этой главе мы будем говорить совсем о другом. Здесь мы рассмотрим такое взаимодействие JavaScript_кода с веб_сервером, при котором веб_броузер не пе_ резагружает текущую веб_страницу.
Теги <img>, <frame> и <script> имеют свойство src. Когда сценарий записывает в это свойство URL_адрес, инициируется HTTP_запрос GET и выполняется загрузка содержимого с этого URL_адреса. Таким образом, сценарий может отправлять информацию веб_серверу, добавляя ее в виде строки запроса в URL_адрес изобра_ жения и устанавливая свойство src элемента <img>. В ответ на этот запрос веб_ сервер должен вернуть некоторое изображение, которое, например, может быть невидимым: прозрачным и размером 1× 1 пиксел.1
1 Такие изображения иногда называют веб'жучками (web bugs). Они пользуются дурной славой из_за проблем с безопасностью, т. к. могут применяться для обмена информацией (подсчета числа посещений и анализа трафика) со сторонним серве_ ром (не тем, откуда была загружена страница). Если же веб_страница устанавлива_ ет свойство src изображения для передачи информации обратно на тот сервер, с ко_ торого она была загружена, особых проблем с безопасностью не возникает.
20.1. Использование объекта XMLHttpRequest
Теги <iframe> достаточно недавно появились в HTML и они более универсальны, чем теги <img>, т. к. позволяют веб_серверу вернуть результат не в виде двоичного файла с изображением, а в удобочитаемом виде, который может быть проверен сце_ нарием. При использовании тега <iframe> сценарий сначала добавляет в URL_адрес информацию, предназначенную для веб_сервера, а затем записывает этот URL_ад_ рес в свойство src тега <iframe>. Сервер создает HTML_документ, содержащий ответ на запрос, и отправляет его обратно веб_броузеру, который выводит ответ в теге <iframe>. При этом элемент <iframe> необязательно должен быть видимым для пользователя – он может быть сокрыт, например средствами таблиц стилей. Сце_ нарий может проанализировать ответ сервера, выполнив обход документа в эле_ менте <iframe>. Обратите внимание: взаимодействие с документом ограничивается политикой общего происхождения, о которой рассказывается в разделе 13.8.2.
Даже изменение свойства src тега <script> может использоваться для иницииро_ вания динамического HTTP_запроса. Использование тегов <script> для взаимо_ действия с протоколом HTTP выглядит особенно привлекательно, потому что когда ответ сервера принимает форму JavaScript_кода, он не требует дополни_ тельного анализа – интерпретатор JavaScript просто исполняет его.
Несмотря на то, что существует возможность использования тегов <img>, <iframe> и <script> для взаимодействия с протоколом HTTP, реализовать такую возмож_ ность на практике переносимым образом гораздо сложнее, чем это выглядит на словах, и в этой главе мы сосредоточимся на другом, более мощном способе дос_ тижения тех же результатов. Объект XMLHttpRequest прекрасно поддерживается всеми современными броузерами и предоставляет полный доступ к протоколу HTTP, включая возможность отправлять запросы методами POST и HEAD в до_ полнение к обычному запросу методом GET. Объект XMLHttpRequest может возвра_ щать ответ веб_сервера синхронно или асинхронно, в виде простого текста или в виде DOM_документа. Несмотря на свое название объект XMLHttpRequest не огра_ ничивается использованием XML_документов – он в состоянии принимать лю_ бые текстовые документы. Объект XMLHttpRequest является ключевым элементом архитектуры веб_приложений, известной как Ajax1. Об Ajax_приложениях мы поговорим после ознакомления с тем, как работает объект XMLHttpRequest.
В конце главы мы вернемся к теме использования тега <script> для организации взаимодействия с протоколом HTTP, и там я продемонстрирую, как можно при_ менить эту методику, когда объект XMLHttpRequest недоступен.