推迟内联javascript执行?

在我的网站上,我有许多内联的javascript片段。 他们中的大多数都需要jquery和类似的东西。

但我想在页面呈现后将jquery加载推迟到。 这意味着,在加载jquery之前,我的内联javascript会执行。 我能做些什么吗? 我正在寻找易于实现的解决方案(我也无法移动我的内联javascript,因为它是在为用户准备页面时自动生成的)。

如果你可以将你的javascript放在文档的末尾会好得多。 使用小型内联javascript代码段为源代码打包是页面性能的杀手锏。

也就是说,你可以在这个数组上创建一个数组并推送函数。 然后,在页面的末尾,在加载jquery之后,遍历数组并执行每个函数。

例如:

  ...  ...  ...    

但是 – 正如我所说的 – 最好将所有脚本元素推送到页面底部,而不是在html和javascript之间来回切换。 如果这样做,渲染性能将严重降低。

您可以通过将内联脚本的type设置为浏览器不会像text/example那样处理的脚本来模拟延迟,并在文档末尾克隆这些脚本,用text/javascript替换type

处理所有text/examples的代码非常简单:

 window.addEventListener("load", function() { var arr = document.querySelectorAll("script[type='text/example']"); for (var x = 0; x < arr.length; x++) { var cln = arr[x].cloneNode(true); cln.type = "text/javascript"; document.querySelectorAll("body")[0].appendChild(cln); } }); 

或者如果你更喜欢使用jQuery(你必须包含jQuery文件添加这个脚本):

 $(function() { $("script[type='text/example']").each(function() { $(this).clone().attr("type","text/javascript").appendTo("body"); }); }); 

此代码等待页面加载,然后选择所有类型为text/example的脚本,并使用text/javascript类型将它们复制到body的末尾,以便正常执行。

例如:

 ...  

Page Title

...

将在控制台中导致这些消息:

我是在h1之后

我在h1之前

你可以在这个JSFiddle上看到一个正在运行的演示: http : //jsfiddle.net/rqckwc79/


这个解决方案的优点:

  • 这是一个跨浏览器的解决方案。
  • 代码是有效的HTML / JavaScript。
  • 它在严格模式下工作。

这个解决方案的缺点:

  • 您需要控制内联脚本才能更改type
  • 正如troelskn所说,性能会比将所有代码移到底部更糟糕(但我知道有些情况下这是不可能的)。
  • 它不适用于较旧的IE版本(尽管可以修改代码以支持它们)。