22

IFRAME 的 onload 事件是在 HTML 完全下载时触发​​,还是仅在所有相关元素也加载时触发?(css/js/img)

4

3 回答 3

20

后者:<body onload=仅在所有相关元素(css/js/img)也已加载时触发。

如果要在加载 HTML 时运行 JavaScript 代码,请在 HTML 末尾执行以下操作:

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

这是有关加载就绪之间区别的相关电子邮件线程(jQuery 支持两者)。

于 2009-05-02T17:35:16.993 回答
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”标签并检查这些标签的“完整”状态。如果未完成,则会在 250 毫秒后延迟重新检查。

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();
    });
}
于 2012-10-12T10:36:57.670 回答
0

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

要在页面的其余部分加载时触发 jQuery(window).load(function(){ 或 window.onload not document onready。

您还可以检查是否加载了图像元素,并且存在...如果图像。负载——等等。

于 2009-05-02T17:37:01.263 回答