6 апр. 2012 г.

IFRAME: перезагрузка

Встала задача подключить чужую страничку в модальном окне внутри своего приложения (то есть надо посмотреть карту - показали окно с картой, не надо - спрятали). Не мудрствуя лукаво, использовал IFRAME, и тут же напоролся на Firefox и WebKit.

Если по-русски, то практически все браузеры кроме IE (и то IE8+ надо ещё проверить) при перемещении IFRAME в дереве DOM очищают его содержимое. То есть:
  1. Мы хотим показать IFRAME внутри модального окна
  2. Для этого надо выдернуть его (removeChild) оттуда, где он был спрятан, и добавить (appendChild) внутри нашего созданного окошка.
  3. После removeChild браузер чистит весь вложенный в IFRAME документ.
  4. На момент показа в новом месте IFRAME оказывается девственно чист, и с чистой совестью начинает загрузку своего содержимого согласно указанному атрибуту src.
Аналогично, только хуже, ведёт себя IFRAME, в который после создания содержимое пишется руками из скрипта (некоторые для этого используют document.write) - у него src пустой, и содержимое после очистки никто не восстановит (тот скрипт, который его создал и наполнил содержимым, давно уже отработал и никак не может узнать, что содержимое IFRAME надо пересоздать).

Судя по багтрекерам, в Firefox эта проблема толком не решена до сих пор (в Firefox 11 ещё не решена, и вроде что-то сделано в ночных сборках Firefox 13), в WebKit придуман "обходной манёвр":


document.adoptNode(iframe); // This does removeChild() internally but does not unload content
document.body.appendChild(iframe);

Комментариев нет:

Отправить комментарий