Почему событие `onload` не срабатывает на вложенных фреймах с очисткой фреймов?

Рассмотрим следующие три страницы.

  1. Foo.html открывается локально в браузере, и поэтому имеет URL с префиксом file:///,
  2. Bar.html находится в том же каталоге Foo.html,
  3. Bar2.html живет в /var/www и я бегу Apache на localhost,

foo.html

<html>
  <head>
  <script>
  foo = function() {
    alert("frame changed");
  };
  </script>
  </head>

  <body>
  <iframe width="200" height="300" src="Bar.html" id="my-iframe" onLoad="foo" /> 
  </body>
</html>

bar.html

<html>
  <body>
  <iframe width="200" height="300" src="http://localhost/Bar2.html" id="my-iframe" /> 
  </body>
</html>

Bar2.html

<html>
  <head>
  <script>
  if (top.location != self.location){
      parent.location = self.location;
  }
  </script>
  </head>
  <body>
  <button type="button" onclick="document.location.href='http://bing.com'">Hello World</button>
  </body>
</html>

когда Foo.html загружается в Firefox, запустив firefox /path/to/Foo.html в командной строке код перебора кадра в Bar2.html вырывается из Bar.html, В этот момент пользователь получает предупреждение frame changed,

Когда я нажимаю кнопку, iframe изменения (кнопка исчезает), но я не получаю предупреждение.

Почему onLoad не стреляете во второй раз, когда страница меняется?

2 ответа

Проблема заключается в том, что при загрузке Bar2.html iframe в Bar.html это условие ложно

if (top.location != self.location)

В результате, когда Bar.html загружает Bar2.html, это называется

parent.location = self.location;

Что вызывает перенаправление на странице и отменяет влияние события onload, так как технически страница никогда не заканчивала загрузку.

Ваш сценарий

  if (top.location != self.location){
      parent.location = self.location;
  }

будет работать на Bar2.htm и изменить местоположение его родителя (ранее Bar.htm). Затем приходит предупреждение. Затем скрипт будет выполняться в родительском (ранее Bar.htm), но top.location все равно не равен self.location. (top.location теперь равен Foo.htm, а self.location равен Bar.htm), поэтому при нажатии кнопки родительская страница перенаправляется на Bar2.htm. Значение кода предупреждения и iframe ушел.

Другие вопросы по тегам