为了加快页面加载时间,我想在页面内容加载后加载JS脚本。
我发现这篇有用的文章解释了当你有一个JS文件时如何做到这一点:https://varvy.com/pagespeed/defer-loading-javascript.html
解决方案是这样的:
<script type="text/javascript">
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "yourSingleJSFile.js";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
在我的例子中,我有4个不同的js文件:jQuery,main.js和index.js,它们以$(document).ready(...);
开头并定义了一个函数initMap()和maps.googleapis.com。因此我将代码更改为
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js";
document.body.appendChild(element);
var element = document.createElement("script");
element.src = "/resources/js/main.js";
document.body.appendChild(element);
var element = document.createElement("script");
element.src = "/resources/js/index.js";
document.body.appendChild(element);
var element = document.createElement("script");
element.src = "https://maps.googleapis.com/maps/api/js?key=***mysecetrkey**&callback=initMap";
document.body.appendChild(element);
每次加载页面时,我都会在控制台中发现JS错误。到目前为止,我发现了两个错误:
第一
ReferenceError:$未定义index.js:9:5
我不明白这里发生了什么。似乎在加载jquery之前包含了index.js。但是如何在main.js中抛出错误?
第二
validValueError:initMap不是函数
在我看来googleapis.com js已经加载但是index.js丢失了(因为我在那里定义了函数initMap())。
如何在加载页面内容后强制脚本加载?
答案 0 :(得分:1)
如果脚本之间存在依赖关系,则需要确保首先加载依赖项。您可以像这样嵌套脚本加载:
var jqueryElement = document.createElement("script");
jqueryElement.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js";
var mainElement = document.createElement("script");
mainElement.src = "/resources/js/main.js";
var indexElement = document.createElement("script");
indexElement.src = "/resources/js/index.js";
var googleApiElement = document.createElement("script");
googleApiElement.src = "https://maps.googleapis.com/maps/api/js?key=***mysecetrkey**&callback=initMap";
// add the first script element
document.body.appendChild(jqueryElement);
jqueryElementElement.onload = function () {
document.body.appendChild(googleApiElement);
}
googleApiElement.onload = function () {
document.body.appendChild(mainElement);
document.body.appendChild(indexElement)
}
我只是猜测你的依赖顺序。