2010-02-24 66 views
2

我正在研究一个WordPress网站,其中有两个外部JavaScript文件在页面的中途加载。这些文件是来自Reddit和Digg的徽章,并且通常会为页面的总加载时间增加约4-8秒 - 同时还会阻止加载页面的底部50%。强制加载外部JavaScript文件(来自Digg,Reddit)最后加载

Digg和Reddit javascripts渲染一个(我认为需要在加载完我的网页的其余部分之前完全加载),并因此增加了大量的额外加载时间。

我试着将<script>标签移动到页面底部,就在</body>之前,但徽章呈现在页脚的下方,而不是他们需要的位置。

如何强制这两个外部javascript文件加载最后一个,但仍然渲染他们需要的位置?

回答

0

如果渲染脚本标记不一定意味着这些脚本生成的UI出现在哪里 - 它似乎是一个愚蠢或可疑的设计。脚本中是否有已知的函数让你向他们提供一个容器div或其中的UI来呈现它们?

你是对的,当然,在加载它们之前,在</body>之前。这是正确的策略。

2

你可以创建一个div [“divA”]你想要你的Digg/Reddit iframe去[所以这基本上只是一个占位符]。当页面加载完成后,追加一个“脚本”元素,以便Digg/Reddit脚本可以加载。加载完成后,您可以将它们从正文移动到divA。

document.body.removeChild(iframe); 
document.body.getElementById("divA").appendChild(iframe); 
+0

这将导致iframe的src加载两次。 – Nicole 2010-02-24 18:46:24

+1

+1在文档中使用片段'document.write',并使用DOM将它移动到正确位置听起来像是最聪明的解决方案。虽然也许不会删除元素,但是将它全部放在一个DIV中,将*移动到正确的位置? – 2010-02-24 18:47:33

+0

Renesis你提出了一个有效的观点。谢谢。你将如何“移动”元素?我想你可以使用javascript的offsetTop,offsetLeft和parentNode来查找“临时”div的x/y位置并将iframe覆盖在它上面。 – Warty 2010-02-24 19:00:38

0

快速回答是 - 没有简单的方法。如果您在脚本标记上使用defer="true",并且它们使用document.write,则它仍会写出加载时的内容,而不是插入脚本标记的位置。

一些在这个问题的答案可以帮助你:How can I stop an IFrame reloading when I change it's position in the DOM?

一些在此线程的其他答案建议您删除的iframe,然后重新插入。但是,这会导致您直接遇到上述链接问题中的问题 - 这会导致iframe的内容加载两次。

一般方法是将占位符放在需要的位置,然后在准备就绪时将它们移动到占位符中。