Pull to refresh

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

Reading time2 min
Views3.3K
Некоторое время назад обнаружил интересный баг в 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 и (что интересно) изначально обнаружен был на одном из сайтов микрософта :)
Tags:
Hubs:
+36
Comments10

Articles

Change theme settings