我一直试图只加载一次大型 js 脚本。我不会在页面加载时加载它,因为那时不需要它并且会减慢页面加载速度。
所以我一直在尝试使用 jQuery 的 $.getScript 和 Modernizr.load 加载它(因为我已经在使用 Modernizr 了)。
我已经尝试遍历所有 <script></script>
元素并检查它们的 src 属性并查看此脚本是否是其中之一,但每次我运行测试时仍然会加载它们。
我还尝试在脚本的开头将一个全局变量设置为 true 并检查它是否已设置并且每次检查时它仍然加载。 这是我在那个例子中所做的:
Modernizr.load({
test:if(window.flag === undefined),
yep:'conversation.js',
callback:function(){
antecedent();
}
});
和var flag = true;
设置在conversation.js的第一行
有没有人知道如何在调用此测试以检查它是否已加载时让此脚本加载一次,然后只加载一次?
** 编辑/更新:** document.getElementsByTagName('head')[0].appendChild(document.createElement('script')).src = 'conversation.js';
可以工作,但我如何检查脚本是否已加载,然后仅在尚未包含脚本时调用它?
最佳答案
首先,您需要检查脚本是否已在页面上:
var list = document.getElementsByTagName('script');
var i = list.length, flag = false;
while (i--) {
if (list[i].src === 'filePathToJSScript') {
flag = true;
break;
}
}
// if we didn't already find it on the page, add it
if (!flag) {
var tag = document.createElement('script');
tag.src = 'filePathToJSScript';
document.getElementsByTagName('body')[0].appendChild(tag);
}
条件中的代码可用于向页面动态添加脚本。
ES 6 更新
ES 6 大大简化了这一点:
let scripts = Array
.from(document.querySelectorAll('script'))
.map(scr => scr.src);
if (!scripts.includes('filePathToJSScript')) {
// same as above
}
关于javascript - 仅在尚未加载 js 脚本时才加载它,然后仅加载一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331600/