究竟IFRAME onload事件何时触发?

时间:2009-05-02 17:32:15

标签: javascript html iframe onload

当HTML完全下载时,或仅当所有相关元素都加载时,IFRAME的onload事件是否会触发? (CSS / JS / IMG)

3 个答案:

答案 0 :(得分:20)

后者:<body onload=仅在所有依赖元素(css / js / img)都被加载时才会触发。

如果要在加载HTML时运行JavaScript代码,请在HTML结尾处执行此操作:

<script>alert('HTML loaded.')</script></body></html>

以下是关于加载 ready 之间区别的relevant e-mail thread(jQuery支持两者)。

答案 1 :(得分:4)

上述答案(使用onload事件)是正确的,但在某些情况下,这似乎行为不端。特别是在动态生成Web内容的打印模板时。

我尝试通过创建动态iframe并打印它来打印页面的某些内容。如果它包含图像,我无法在加载图像时触发它。当图像仍然加载时,它总是会过快闪烁,导致打印不完整:

function printElement(jqElement){
    if (!$("#printframe").length){
        $("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />');
    }

    var printframe = $("#printframe")[0].contentWindow;
    printframe.document.open();
    printframe.document.write('<html><head></head><body onload="window.focus(); window.print()">');
    printframe.document.write(jqElement[0].innerHTML);
    printframe.document.write('</body></html>');
//  printframe.document.body.onload = function(){
//      printframe.focus();
//      printframe.print();
//  };
    printframe.document.close();
//  printframe.focus();
//  printframe.print();

//  printframe.document.body.onload = function()...
}

正如你所看到的,我尝试了几种绑定onload处理程序的方法......无论如何它都会过早发生。我知道,因为浏览器打印预览(谷歌浏览器)包含损坏的图像。当我取消打印并再次调用该功能(图像现在被缓存)时,打印预览就可以了。

...幸运的是我找到了解决方案。不漂亮但合适。它做了什么,它扫描子树的'img'标签并检查那些'完整'的状态。如果未完成,则会在250ms后延迟重新检查。

function delayUntilImgComplete(element, func){
    var images = element.find('img');
    var complete = true;
    $.each(images, function(index, image){
        if (!image.complete) complete = false;
    });
    if (complete) func();
    else setTimeout(function(){
        delayUntilImgComplete(element, func);}
    , 250);
}    

function printElement(jqElement){
    delayUntilImgComplete(jqElement, function(){
        if (!$("#printframe").length){
            $("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />');
        }

        var printframe = $("#printframe")[0].contentWindow;
        printframe.document.open();
        printframe.document.write(jqElement[0].innerHTML);
        printframe.document.close();
        printframe.focus();
        printframe.print();
    });
}

答案 2 :(得分:0)

正好在加载html时,而不是依赖元素。 (或者我认为)。

当页面的其余部分加载时触发jQuery(窗口).load(function(){或window.onload不是文档onready。

您还可以检查是否加载了图像元素,如果是图像。 load-- etc。