getScript - 如何仅在未调用时调用

AnA*_*ice 16 jquery

在点击上,以下内容被加载:

$.getScript('/javascripts/contacts.js');
Run Code Online (Sandbox Code Playgroud)

我怎么写一个说的话

如果上面的getScript已经加载了X,如果没有加载它,做Y ...?

谢谢

Mau*_*ord 14

var gotContacts = 0;
function getContacts(){
    if (!gotContacts){
        $.getScript('/javascripts/contacts.js', function() {
            gotContacts = 1;
            doSomethingWithContacts();
        });
    }else{
        doSomethingWithContacts();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在获取脚本所花费的时间内发生多个请求的危险,那么您还可以在getScript之前添加一个挂起标志('gettingContacts'),以便仅触发第一个请求.如果不这样做,最终可能会多次将脚本加载到DOM中. (3认同)

小智 7

我的情况不同了.我使用菜单使用jquery将内容加载到div中.为了防止在标题部分中出现太多脚本,我使用.getscript仅在调用该链接时才加载文件.这是我提出的防止重复的解决方案:

首先,我创建一个负责加载脚本的函数.这是我网站上global.js文件的一部分,global.js文件被硬编码到标题中:

var loadedScripts=new Array();

function loadScriptFiles(scriptArray){

    if($.isArray(scriptArray)){
        $.each(scriptArray, function(intIndex, objValue){
            if($.inArray(objValue, loadedScripts) < 0){
                $.getScript(objValue, function(){
                    loadedScripts.push(objValue);
                });
            }
        });
    }
    else{
            if($.inArray(script, loadedScripts) < 0){
                $.getScript(script, function(){
                    loadedScripts.push(objValue);
                });
            }





    }
}
Run Code Online (Sandbox Code Playgroud)

这需要两种类型的加载,可以是数组,也可以是单个脚本值.如果它是一个数组,它会循环遍历每个元素并加载它.如果它不是一个数组,那么它只会加载一个文件.你会在一分钟内看到那部分.

重要部分:请参阅我在全局范围内(函数外部)创建了一个名为loadedScripts的数组.因为这是global.js文件的一部分,所以它永远不会重新加载,可以从任何地方调用.但是出于我们的目的,我只是检查要加载的脚本名称是否已经在数组中使用:

if($.inArray(objValue, loadedScripts) < 0){
Run Code Online (Sandbox Code Playgroud)

因为如果找不到值,jquery inarray函数返回-1,我只会在值小于0时继续.其他任何意味着值都在数组中.

以下是调用要使用的函数的方法.将此代码放在将被调用的动态页面的任何位置(我将其放在顶部).

<script type="text/javascript">
    var scriptArray=new Array();
    scriptArray[0]="[REPLACE THIS WITH THE PATH TO THE JS FILE]";
    scriptArray[1]="[REPLACE THIS WITH THE PATH TO THE JS FILE]";
    loadScriptFiles(scriptArray);
</script>
Run Code Online (Sandbox Code Playgroud)

如果操作正确,您会发现它只会加载一次.


Lor*_*ran 6

我创建了一个几乎完全符合你想要的插件:$.getScriptOnce().

如果您尝试将相同的脚本加载两次或更多次,则不会加载脚本并返回false.

但基本上,它定义了这个替代功能 $.getScript()

(function($) {
    $.getScriptOnce = function(url, successhandler) {
       if ($.getScriptOnce.loaded.indexOf(url) === -1) {
            $.getScriptOnce.loaded.push(url); 
            if (successhandler === undefined) {
                return $.getScript(url);
            } else {
                return $.getScript(url, function(script, textStatus, jqXHR) {
                    successhandler(script, textStatus, jqXHR);
                });
            }
       } else {
           return false;
       }

    };

    $.getScriptOnce.loaded = [];

}(jQuery));
Run Code Online (Sandbox Code Playgroud)

然后简单地打电话 $.getScriptOnce('yourFile.js')

  • 您是对的,我已删除此存储库。我找到了脚本并将其放在新的仓库中:https://github.com/RalonIT/jquery-getscriptonce并更新了答案。 (2认同)