请考虑以下三页。
Foo.html
在浏览器中本地打开,因此具有前缀为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>
在Firefox中加载Foo.html
时,通过在命令行上运行firefox /path/to/Foo.html
,Bar2.html
中的帧破坏代码会突破Bar.html
。此时,用户会收到警报frame changed
。
当我点击按钮时,iframe
更改(按钮消失),但我没有收到提醒。
为什么onLoad
在页面更改时第二次没有触发?
答案 0 :(得分:1)
问题在于,当Bar.html中的iframe加载Bar2.html时,这个条件是假的
if (top.location != self.location)
因此,当Bar.html加载Bar2.html时,这称为
parent.location = self.location;
由于页面在技术上从未完成加载,因此会在页面中发出重定向并取消onload事件的影响。
答案 1 :(得分:0)
您的脚本
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消失了。