Exactly when does an IFRAME onload event fire?
HTML完全下载后,还是仅在所有相关元素也加载时,才触发IFRAME的onload事件? (css / js / img)
后者:
如果要在加载HTML后运行JavaScript代码,请在HTML末尾执行以下操作:
1 | alert('HTML loaded.')</body></html> |
这是有关负载和就绪(jQuery支持两者)之间差异的相关电子邮件线程。
上面的答案(使用onload事件)是正确的,但是在某些情况下,这似乎是不正确的。特别是在动态生成Web内容的打印模板时。
我尝试通过创建动态iframe并进行打印来打印页面的某些内容。如果包含图像,则在加载图像时无法启动它。当图像仍在加载时,总是会过早触发,从而导致打印不完整:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 onloadx="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毫秒后的重新检查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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(); }); } |
只是在加载html时,而不是从属元素。 (或者我认为)。
要在页面其余部分加载时触发,请执行jQuery(window).load(function(){或window.onload而不是文档就绪)。
您还可以检查图像元素是否已加载,以及...是否图像。负载-等