【问题标题】:Detect if script has already loaded or not检测脚本是否已经加载
【发布时间】:2012-11-14 15:28:30
【问题描述】:

根据我单击#load 的次数,helloworld.js 似乎被多次加载。我这样说是因为当我查看 Google Chrome 开发者工具网络选项卡时,它显示 helloworld.js 的次数与我点击 #load 的次数一样多。

$(document).ready(function() {

    $("#load").click(function(){
        $.getScript('helloworld.js', function() {
            hello();
        });
    });

});

hello() 函数如下所示:

function hello(){
    alert("hello");
}

是否可以检测helloworld.js是否已经加载?

所以如果还没有加载,就加载它,如果已经加载,就不要加载它。

如果我点击#load 按钮 4 次,这就是开发者工具当前向我显示的内容:

【问题讨论】:

  • 你也可以让它使用缓存:$.ajaxSetup({ cache: true });(取自here)。
  • 调用应该已经被浏览器缓存了……
  • @ShadowWizard,这似乎有效,谢谢。这应该是一个答案。
  • @feeela 默认情况下,jQuery 将为每个 AJAX 调用添加唯一的时间戳,这样它就不会被缓存。通过将属性设置为 false,它不会添加任何唯一值。
  • @feeela $.getScript 是个例外,它默认为cache:false,除非在ajaxSetup 中特别设置。 (根据文档)

标签: javascript jquery google-chrome internet-explorer-8 getscript


【解决方案1】:

文件加载成功时设置一个标志。如果设置了标志,则再次跳过文件加载。

试试这个代码,

    var isLoaded = 0; //Set the flag OFF 

    $(document).ready(function() {

        $("#load").click(function(){
            if(isLoaded){ //If flag is ON then return false
                alert("File already loaded");
                return false;
            }
            $.getScript('helloworld.js', function() {
                isLoaded = 1; //Turn ON the flag
                hello();

            });
        });

    });

【讨论】:

    【解决方案2】:

    那么为什么不只像这样触发一次事件:

    $("#load").one("click", function() {
       $load = $(this);
       $.getScript('helloworld.js', function() {
           hello();
           // bind hello to the click event of load for subsequent calls
           $load.on('click', hello); 
       });
    });
    

    这将防止后续加载并避免使用全局

    【讨论】:

    • 要添加,在hello()之后使用$("#load").click(hello)进行后续点击#load调用hello方法而不重新加载js。
    • @Gabe,我需要多次运行hello()函数,但只需要加载一次helloworld.js
    【解决方案3】:

    另一种选择是让.getScript() 运行,但让它从浏览器的缓存中获取脚本,这样您就不会每次都重新加载它。

    为此,添加这样的代码:

    $.ajaxSetup({
        cache: true
    });
    

    这取自documentation page

    【讨论】:

    • 如果脚本文件有一些事件绑定代码,事件不会绑定多次,每次文件加载或从缓存中取出?
    • @Reddy 是真的,没想到。我的答案是this other answer 的替代方案,建议使用.one(),我必须承认在这种情况下更好。
    • 您的回答完全没有问题。只是想知道,因为我有一个问题,我加载了一个包含本地脚本的 html 页面,并且事件绑定了多次。只是想知道从缓存中读取时是否相同。
    • @Reddy 是的,它可能确实会再次绑定它们,尽管值得深入检查。
    【解决方案4】:

    你可以创建一个辅助函数:

    var getScript = (function() {
      var loadedFiles = {};
      return function(filename, callback) {
        if(loadedFiles[filename]) {
          callback();
        } else {
          $.getScript(filename, function() {
            loadedFiles[filename] = true;
            callback();
          });
        }
      };
    })();
    

    【讨论】:

    • 实现这样的缓存系统并非易事。例如,如果在检索和执行相关文件之前为同一文件名多次调用getScript 会怎样?
    • @Šime Vidas:好点子。另一方面,只有当您以非常快的速度多次单击时才会发生这种情况,这可能不值得关心。
    • 由于我的父母经常双击网页上的按钮和链接,我认为这种情况会比你想象的更频繁:P
    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 2015-04-16
    • 2011-05-07
    • 2021-08-08
    • 2017-07-12
    • 2017-11-17
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多