Почему событие `onload` не срабатывает на вложенных фреймах с очисткой фреймов?
Рассмотрим следующие три страницы.
Foo.html
открывается локально в браузере, и поэтому имеет URL с префиксомfile:///
,Bar.html
находится в том же каталогеFoo.html
,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 ушел.