javascript - 仅在尚未加载 js 脚本时才加载它,然后仅加载一次

标签 javascript jquery

我一直试图只加载一次大型 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('sc‌​ript')).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/

相关文章:

javascript - 函数调用后虚拟数组值未填充

javascript - 将绝对定位的 DIV 添加到 OpenLayers map 的底部?

javascript - 如何忽略 Backbone.history.start 上 URL 中的哈希值

javascript/jquery 范围让我难住了

jquery - iphone 设备上的 Animate.css 问题

javascript - 使用 Javascript 获取基于 future 日期的先前日期

javascript - 如何从剩余时间中减去时间?

javascript - 如何在 Jest 测试中调用 native console.log 方法?

jquery - 我如何应用 jQuery.click 来自动点击元素的第一级?

javascript - 如何 append 到使用 jquery 在 for 循环中动态创建的 div 名称?