onload需要在解析时识别函数吗?

时间:2013-11-03 11:15:33

标签: javascript html

我有这个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被翻译为:

enter image description here

即便如此 - 在解析时并不需要知道aaa。 - 因为有包装功能。

注意:iframe的load事件是用于加载页面而不是元素创建。

所以 - 当它解析iframe时 - 它开始异步加载iframe - 不阻止,然后立即进入声明aaa的脚本部分

我缺少什么(我正在寻找原因 - 不是解决方案)。 ?如果我打电话给onload或onclick会有什么不同?

看起来iframe onload在解析时需要该函数。 (而不是在运行时 - 事件实际发生时。)

2 个答案:

答案 0 :(得分:1)

iframe元素未定义为EMPTY。 (如果不支持或禁用iframe,则元素的内容是要呈现的内容)。因此,您不能使用XML空元素语法来表示iframe。您需要一个明确的结束标记。

您提供的脚本元素作为替代内容。如果呈现iframe,则将忽略替代内容,因此将不会执行该脚本,并且该函数将永远不会添加到JS环境中。

使用<iframe></iframe>代替<iframe />your non-working example is fixed

答案 1 :(得分:0)

元素在代码本身中按照它们的顺序呈现。脚本也是如此(当使用deferasync指定外部脚本时除外)。因此,当加载iframe时,它无法立即找到aaa的函数定义,因此aaa()的情况下不会调用onload但是onclick()的情况下在script事件发生之前,iframeclick都已加载(因为click是手动执行的,但load是自动执行的。

因此,建议将所有函数定义保留在script的{​​{1}}部分,以便将来调用这些函数。