# IFRAME для AJAX и COMET Эта глава посвящена `IFRAME` -- самому древнему и кросс-браузерному способу AJAX-запросов. Сейчас он используется, разве что, для поддержки кросс-доменных запросов в IE7- и, что чуть более актуально, для реализации COMET в IE9-. Для общения с сервером создается невидимый `IFRAME`. В него отправляются данные, и в него же сервер пишет ответ. [cut] ## Введение Сначала -- немного вспомогательных функций и особенности работы с `IFRAME`. ### Двуличность IFRAME: окно+документ Что такое IFRAME? На этот вопрос у браузера два ответа
  1. IFRAME -- это HTML-тег: <iframe> со стандартным набором свойств.
  2. IFRAME -- это окно браузера, вложенное в основное
Для достижения цели мы будем работать как с тегом, так и с окном. Они, конечно же, взаимосвязаны. **В теге `"); return htmlfile.body.lastChild; } ```
  1. Вспомогательный объект `htmlfile` будет один и он будет глобальным. Можно и спрятать переменную в замыкании. Смысл в том, что в один `htmlfile` можно записать много ифреймов, так что не будем множить сущности и занимать ими лишнюю память.
  2. В `htmlfile` можно записать любой текст и, при необходимости, через `document.write(' ``` Здесь `parent'ом` для `iframe'а` будет `htmlfile`, т.е. `CallbackRegistry` будет искаться среди переменных соответствующего ему окна, а вовсе не верхнего `window`. Окно для `htmlfile` доступно как `htmlfile.parentWindow`, копируем в него ссылку на реестр коллбэков `CallbackRegistry`. Теперь ифрейм его найдёт.
  3. Далее вставляем ифрейм в документ. В старых `IE` нельзя поменять `name` ифрейму через DOM, поэтому вставляем строкой через `insertAdjacentHTML`.
Пример в действии (только IE): [codetabs src="date-activex"] Запрос, который происходит, полностью незаметен. Метод POST делается аналогично, только форму ужно добавлять не в основное окно, а в `htmlfile`, через вызов `htmlfile.appendChild`. В остальном -- всё так же, как и при обычной отправке через ифрейм. Впрочем, для COMET нужен именно GET. Можно и сочетать эти способы: если есть ActiveX: `if ("ActiveXObject" in window)` -- используем методы для IE, описанные выше, а иначе -- обычные методы. Вот мини-приложение с сервером на Node.JS, непрерывно получающее текущее время с сервера через `