我有这个iframe:
<iframe src='http://jsbin.com/iyaVOSe/1' onload='aaa()' id='ifr'/>
但只有在iframe之前声明函数时,onload才有效:
工作:(http://jsbin.com/ObeQERE/3/edit)
<script>
window.aaa= function ()
{
alert('load');
}
</script>
<iframe src='http://jsbin.com/iyaVOSe/1' onload='aaa()' id='ifr'/>
无效:(aaa
未定义)(http://jsbin.com/ObeQERE/4/edit)
<iframe src='http://jsbin.com/iyaVOSe/1' onload='aaa()' id='ifr'/>
<script>
window.aaa= function ()
{
alert('load');
}
</script>
这很奇怪,因为onload会有一些延迟发生,而且 - 当不使用iframe而不是onclick事件时无关紧要:
输入工作示例
<input onclick='aaa()' />
<script>
window.aaa= function ()
{
alert('load');
}
</script>
同样在iframe样本中 - aaa
被翻译为:
即便如此 - 在解析时并不需要知道aaa
。 - 因为有包装功能。
注意:iframe的load事件是用于加载页面而不是元素创建。
所以 - 当它解析iframe
时 - 它开始异步加载iframe - 不阻止,然后立即进入声明aaa
的脚本部分
我缺少什么(我正在寻找原因 - 不是解决方案)。 ?如果我打电话给onload或onclick会有什么不同?
看起来iframe onload
在解析时需要该函数。 (而不是在运行时 - 事件实际发生时。)
答案 0 :(得分:1)
iframe元素未定义为EMPTY。 (如果不支持或禁用iframe,则元素的内容是要呈现的内容)。因此,您不能使用XML空元素语法来表示iframe。您需要一个明确的结束标记。
您提供的脚本元素作为替代内容。如果呈现iframe,则将忽略替代内容,因此将不会执行该脚本,并且该函数将永远不会添加到JS环境中。
使用<iframe></iframe>
代替<iframe />
和your non-working example is fixed。
答案 1 :(得分:0)
元素在代码本身中按照它们的顺序呈现。脚本也是如此(当使用defer
或async
指定外部脚本时除外)。因此,当加载iframe
时,它无法立即找到aaa
的函数定义,因此aaa()
的情况下不会调用onload
但是onclick()
的情况下在script
事件发生之前,iframe
和click
都已加载(因为click
是手动执行的,但load
是自动执行的。
因此,建议将所有函数定义保留在script
的{{1}}部分,以便将来调用这些函数。