一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:

var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";

if (!/*@cc_on!@*/0) { //if not IE
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
} else {
    iframe.onreadystatechange = function(){
        if (iframe.readyState == "complete"){
            alert("Local iframe is now loaded.");
        }
    };
}

document.body.appendChild(iframe);

最近, Nicholas C. Zakas 文章《Iframes, onload, and document.domain》的评论中 Christopher 提供了一个新的判断方法(很完美):

var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

几点补充说明:

  1. IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册。
  2. 第二种方法比第一种方法更完美,因为 readystatechange 事件相对于 load 事件有一些潜在的问题。


共有34 条评论

  1. 1. 头像 keshin

    IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册。
    受教

  2. 2. 头像 cc

    在ff的oninput也是不能直接dom.oninput不知为什么呢

  3. 3. 头像

    good!!

  4. 4. 头像 thinker_creator

    这篇文章好, 我就觉得你应该多写点文章, 让咱也多学点, 更新频率忒低了!

  5. 5. 头像 vapour

    请教下 /*@cc_on!@*/0 什么意思。

  6. 6. 头像 怿飞

    @thinker_creator 呵呵,精力有限,只能做到每月的更新。

  7. 7. 头像 怿飞

    @vapour 仅仅是一个判断浏览器的hack,看的时候知道就行,可以过滤。

  8. 8. 头像 崔凯

    技术就那么多,写来写去的……

    怿飞 每月更新 已经很强了,总是能发现新东西……

  9. 9. 头像 松鼠

    readystatechange 事件相对于 load 事件有一些潜在的问题: 想详细了解一下都有哪些潜在问题

  10. 10. 头像 tn requin

    iframe 不提倡用啊。。。

  11. 11. 头像 成都网站建设

    过了阵时间我都要过来看看,都能学到不少东西,支持!

  12. 12. 头像 letle

    不错的内容

  13. 13. 头像 vêtements femmes

    看了一下,学的东西还真的不少

  14. 14. 头像 aksoft

    这个挺实用~

  15. 15. 头像 三国演义博客

    很好很实用,我也是学习者,有时间会来看。

  16. 16. 头像 kinstrace

    今天又来学习了,拜读佳作!

  17. 17. 头像 Jonllen

    原来ie里iframe能通过attachEvent注册onload事件,受教了。

  18. 18. 头像 晴枫

    学习了~

  19. 19. 头像 qiaojianwei

    我想问下,能不能获取iframe装载的那个页面的高度,继而来调整iframe所在的页面的高度?另外想问下所谓的跨域问题?比如我从一个JSP页面里用iframe加载了另外一个服务器上的html也没?但是我写的JS没有执行?

  20. 20. 头像 Frusop

    好地方,常来学习下。。。

  21. 21. 头像 xx

    第二种方法比第一种方法更完美,因为 readystatechange 事件相对于 load 事件有一些潜在的问题。

    到底是什么问题呢
    没说清楚啊

  22. 22. cloudgamer

    简便无刷新文件上传系统…

    之前写过一个仿163网盘无刷新多文件上传系统,已经对无刷新上传文件的原理做了详细的分析。
    而这次的系统主要是针对单个file控件的,便携版,使用更简单,还有更深入的分析。
    ps:flash实现的效……

  23. 23. Silentash-默尘 » Iframe Tips ABC

    [...] 姑且算是牛D吧 =.=!牛C:iframe.onload关于 onload 这点大家可以参考怿飞师父的文章:判断 iframe 是否加载完成的完美方法,在此纯引用一次代码: [...]

  24. 24. 头像 simaopig

    最后的说明很重要。我真的不知道ie得用attachEvent来处理ifarame的onload。。长知识了。

  25. 25. Iframe Tips ABC - 迪娜进行时

    [...] 关于 onload 这点大家可以参考怿飞师父的文章:判断 iframe 是否加载完成的完美方法,在此纯引用一次代码: [...]

  26. 26. 头像 iframe临时加载

    关于 commons上传图片怎么弄

  27. 27. 简便无刷新文件上传系统 - Web开发常见问题 - 简便无刷新文件上传系统 Web 开发 JavaScript 简便无刷新文件上传系统 Web 开发 JavaScript 简便无刷新文件上传系统 Web 开发 JavaScript 简便无刷新文件上传

    [...] 为了能在文件上传完成后执行回调函数,会在iframe的onload中执行_finish函数:var finish = this._fFINISH = $$F.bind(this._finish, this);if ( $$B.ie ) { iframe.attachEvent( "onload", finish );} else { iframe.onload = $$B.opera ? function(){ this.onload = finish; } : finish;}在ie需要用attachEvent来绑定onload,因为在ie中直接设置onload是无效的。除了用attachEvent还可以用onreadystatechange代替。至于原因我也不清楚,详细参考“判断 iframe 是否加载完成的完美方法”。 [...]

  28. 28. 头像 zhouqicf

    IE下直接“note.onload = function(){}”也可以注册的,难道这样促发的时间不准确?

  29. 29. 头像 乘风

    我拿后来那段代码发现有问题,还是用readystatechange比较好吧
    因为用onload的话,iframe里调用的页面如果存在jscript错误,就失去作用了,原因不知道,但效果是如此。而用readystatechange就没有这个问题

  30. 30. GodSon

    判断 iframe 是否加载完成的完美方法…

    var iframe = document.createElement("iframe"); iframe.src = "http://www.planabc.net"; if (iframe.attachEvent){     iframe.attachEvent("onload", function(){         alert("Local iframe is …

  31. 31. 结合iframe,window.name实现跨域访问 | 工夫茶

    [...] 使用 window.name 解决跨域问题 判断 iframe 是否加载完成的完美方法 自己用纯js也模仿着实现了一个 [...]

  32. 32. 头像 applezqp

    “readystatechange 事件相对于 load 事件有一些潜在的问题”,到底是存在什么问题呢?

  33. 33. Simple no refresh file upload system

    [...] In ie need to use attachEvent to binding onload, because in ie directly set onload is invalid.In addition to use attachEvent can also use the onreadystatechange instead.As for the reason I also not clear, detailed reference"Judge whether iframe loaded perfect method”。 [...]

  34. 34. 头像 胡尐睿丶

    直接用jq里的load不行么?

发表评论

(必填)

(必填,会为您保密)

评论仅支持“a、abbr、strong、em、blockquote、code”几个简单的标签