Веб-разработка

индекс
236,88

Оригинальный баг с iframe и DOM в IE

Некоторое время назад обнаружил интересный баг в IE, успешно доживший и до восьмой версии. Суть бага заключается в том, что при уходе со страницы содержащей несколько iframe-ов и последующем возврате при помощи кнопки back, содержимое этих самый фреймов может перемешаться.

UPD: Говорят FF и Opera на этом коде тоже косячат, но по-другому :)

Причиной этому является манипулирование деревом документа при помощи скриптов. А точнее перенос iframe объекта в другое место документа, с изменением линейного порядка фреймов.

После некоторых исследований, обнаруживается такая схема:
  1. уходя со страницы, IE запоминает ссылки во фреймах обходя текущее (измененное) дерево документа
  2. возвращаясь на страницу, исходное дерево обходится на предмет поиска фреймов и в них загружаются сохраненные на прошлом шаге адреса. поскольку порядок фреймов отличается, получается каша
  3. срабатывает скрипт, фреймы стают на свои места, но содержимое в них уже перемешано

Как обычно, один пример лучше тысячи объяснений. На следующей страничке надо прсто нажать «Test link» и потом вернуться назад.
Copy Source | Copy HTML
  1. <html><body>
  2.     <div id="container">
  3.         <iframe src="http://google.com/" id="frame1"></iframe>
  4.         <iframe src="http://microsoft.com/"></iframe>
  5.         <iframe src="http://habrahabr.ru/"></iframe>
  6.     </div>
  7.     <div><a href="http://google.com/">Test link</a></div>
  8.  
  9.     <script type="text/javascript">
  10.         document.getElementById("container").appendChild(document.getElementById("frame1"));
  11.     </script>
  12. </body></html>


К слову, похоже баг вопроизводится только в IE и (что интересно) изначально обнаружен был на одном из сайтов микрософта :)
+36
13 июня 2009, 20:31
7

комментарии (10)

+12
kichik #
Не менее интересно то, что
— Safari 4.0 и Chrome 2.0 iframe c Google ставят последним
— Firefox 3.0.10 выдает два iframe с Google, убивая куда-то iframe с хабром
— Opera 10b при возврате выдает два хабра.
+2
kichik #
Пардон, с учетом скрипта webkit перемещает элементы правильно :)
–1
valeron #
А вдруг это фича! :)
0
danilissimus #
Перефразируя известное ысказыание…
IE — это не фича! Это баг!
+8
nullbie #
+2
alfsoft #
Много лет меня бесил кочующий по версиям баг в IE: если сначала сайт не загрузился по какой-либо причине, то заголовок окна становилса «Страница не найдена». И если даже потом обновить ее, и сайт загрузится, то заголовок так и оставался «Страница не найдена». Скажите, пожалуйста, сейчас так же осталось в 7 и 8 версиях?
+1
naum #
Вы не поверите, но этот же баг вызывается достаточно часто в проводнике Microsoft Windows XP (за остальные ответственности не несу). Имеется в виду ситуация, когда в заголовке выдается различного рода служебная информация, допустим, оповещение об отсутствии ответа от окна.

ЗЫ. Имеются в виду только(!) окна процесса explorer.exe
0
omfg #
Разработчики поленились где-нибудь в пятерке, с учетом на то что фреймы скоро уйдут в прошлое, а вы им еще и баг репорт сейчас напишете.пожалейте людей, выходные все таки)
–5
zorro1211 #
IE6 — разработчики поленились
IE7 — разработчики поленились, но почесали затылок и пофиксили там где поленились в предыдущей версии
IE8 — разработчики не поленились и обновили предыдущую версию, но не решили проблему с первой
+1
Inversion #
… вот ещё и поэтому фреймы — зло.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.