`
DBear
  • 浏览: 231083 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类

【转】Firefox下iframe的onload事件有可能无法触发 作者:zhanglili

阅读更多

Firefox下,已经load的document,重新open再write一个iframe,则这个iframe的onload不会执行。

重现步骤

  1. 在页面中放置一个iframe,并注册一个onload处理函数。
  2. 在该处理函数中,打开iframe的文档流。
  3. 向文档流使用document.write写入一个iframe,这个iframe包含一个onload属性。
  4. 查看onload的处理函数是否执行。

期望结果

iframe的onload处理函数正确执行。

实际结果

第二层iframe的onload函数没有执行。

影响范围

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>我去你喵的</title>
</head>
<body>
    <script>
        var loaded = false;
        function load(iframe) {
            if (!loaded) {
                loaded = true;
                var doc = iframe.contentWindow.document;
                doc.open();
                doc.write('<iframe src="about:blank" onload="alert(\'!!\');"><\/iframe>');
                doc.write('</body>');
                doc.close();
            }
        }
    </script>
    <iframe src="about:blank" onload="load(this);"></iframe>
</body>
</html>

解决方案

需要向iframe的文档流写入数据的情况,通常出现在使用一个src为about:blank的iframe元素占位的情况下,因此外层iframe的onload事件没有太大意义。

可以在iframe元素之后内联一段脚本以达到写入iframe的文档流的目的,通过document.getElementsByTagName('iframe')的最后一个获取该iframe元素。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>我去你喵的</title>
</head>
<body>
    <iframe src="about:blank"></iframe>
    <!-- 以下代替onload -->
    <script>
        var frames = document.getElementsByTagName('iframe');
        var iframe = frames[frames.length - 1];
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write('<iframe src="about:blank" onload="alert(\'!!\');"><\/iframe>');
        doc.write('</body>');
        doc.close();
    </script>
</body>
</html>

分享到:
评论

相关推荐

    js的image onload事件使用遇到的问题

    在FF(即Firefox)浏览器中,即使图片来自缓存,onload事件也会被触发,这说明了不同浏览器间在处理缓存和事件触发机制上存在差异。为了解决这个问题,需要在onload事件处理程序中重新指定img.src属性。这样做的目的...

    iframe中onload的bug

    NULL 博文链接:https://snandy.iteye.com/blog/666530

    js触发事件大全

    JavaScript 是一种广泛用于网页和网络应用的脚本语言,它在网页交互中扮演着重要角色,其中事件处理是其核心功能之一。事件是用户或浏览器对页面进行操作时触发的特定情况,例如点击按钮、滚动页面等。本文将详细...

    js下判断 iframe 是否加载完成的完美方法.docx

    接着,我们添加了一个 onload 事件处理函数,该函数将在 iframe 加载完成后触发。 方法二:使用 attachEvent 方法 在 IE 浏览器中,onload 事件不起作用,因此我们需要使用 attachEvent 方法来注册 onload 事件。...

    javaScript的onload事件例子

    javaScript的onload事件的代码,javaScript内嵌在html中。

    iframe的onload在Chrome/Opera中执行两次Bug的解决方法

    标题提到的问题是`iframe`的`onload`事件在这些浏览器中会被触发两次,这可能导致不必要的操作或逻辑错误。 这个问题的根本原因在于事件监听器的添加时机。在描述中给出的示例代码中,开发者首先创建了一个`iframe`...

    iframe的onreadystatechange事件在firefox下的使用

    标题提到的问题是关于`iframe`的`onreadystatechange`事件在Firefox下不被支持的情况。 `onreadystatechange`事件是JavaScript中的一个非常重要的事件,主要用于监测DOM对象(如XMLHttpRequest或`iframe`)的就绪...

    JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果

    然而,由于历史原因,不同浏览器(比如Firefox和Internet Explorer)对iframe的onload事件的实现存在差异,导致直接编写跨浏览器代码可能会遇到兼容性问题。 针对上述问题,本文提供了一种兼容性解决方案。首先,...

    脱离document.onload和window.onload的onload事件

    脱离document.onload和window.onload的onload事件,可多次添加加载事件!

    鼠标触发的事件,JS脚本

    4. onLoad:页面内空完成传送到浏览器时触发的事件,包括外部文件引入完成。 5. onMove:浏览器的窗口被移动时触发的事件。 6. onResize:当浏览器的窗口大小被改变时触发的事件。 7. onScroll:浏览器的滚动条位置...

    解决IE,Firefox,chrome,safari浏览器中iframe显示高度自适应问题

    例如,在IE6中,`iframe`能够正常显示,但在其他浏览器如Firefox、Chrome和Safari中,可能出现高度过小或过大,无法正确反映`iframe`内部内容的实际高度。这不仅影响用户体验,还可能破坏网页的整体布局。 #### ...

    IE iframe的onload方法分析小结

    在非IE浏览器(如Firefox、Chrome等)中,我们可以直接使用`&lt;iframe&gt;`的`onload`事件进行绑定,例如: ```javascript var iframe = document.createElement("iframe"); iframe.src = "http://example.com"; iframe....

    JQuery-- onload,ready方法详细解说

    在这种情况下,我们可以使用 $(window).load() 方法,这个方法会等到页面所有内容加载完毕后才会触发,并且同时又没有 onload 事件的弊端。 在实际开发中,我们可以根据实际情况选择使用 ready 事件或 onload 事件...

    JavaScript触发事件列表

    "JavaScript触发事件列表" JavaScript是一种广泛应用于Web开发的编程语言,它提供了许多事件处理机制,以便开发者能够捕捉和响应用户交互操作。下面是JavaScript触发事件列表,涵盖了常见的事件类型和应用场景: ...

    微信小程序onLaunch异步,首页onLoad先执行?

    本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执行了。   //app.js App({ onLaunch: ...

    javascript:onmouse事件大全

    * onLoad:页面内空完成传送到浏览器时触发的事件,包括外部文件引入完成 * onMove:浏览器的窗口被移动时触发的事件 * onResize:当浏览器的窗口大小被改变时触发的事件 * onScroll:浏览器的滚动条位置发生变化时...

    ie中 body onload 和 window onload 解决法案

    但需要注意的是,如果页面中有延迟加载的外部资源(如图片),`body.onload`可能在这些资源加载之前就触发了。 相对地,`window.onload` 是一个全局的事件,它关注的是整个页面(包括`&lt;head&gt;`和`&lt;body&gt;`)以及所有...

Global site tag (gtag.js) - Google Analytics