1

我有这个 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 的加载事件是为了加载页面而不是创建元素。

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

我错过了什么(我在寻找一个原因 - 不是解决方案)。? 如果我调用 onload 或 onclick 有什么区别?

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

4

2 回答 2

1

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

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

使用<iframe></iframe>代替,<iframe />的非工作示例是固定的

于 2013-11-04T15:16:59.490 回答
0

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

因此,建议将所有函数定义保留在script部分中,head以便将来调用这些函数。

于 2013-11-03T14:08:17.743 回答