Подтвердить что ты не робот

GetScript - как звонить только если не вызван

на Click, загружается следующее:

$.getScript('/javascripts/contacts.js');

Как написать выражение, в котором говорится

если вышеприведенный getScript уже загружен, X, если он не загружен, сделайте Y...?

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

Моя ситуация была другая. Я использовал меню для загрузки содержимого в div с помощью jquery. Чтобы предотвратить появление большого количества скриптов в разделе заголовка, я использовал .getscript для загрузки файла только в том случае, если эта ссылка была вызвана. Вот решение, которое я придумал, чтобы предотвратить дубликаты:

Сначала создаю функцию, которая отвечала за загрузку script. Это часть файла 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);
                });
            }





    }
}

Это требует двух типов нагрузок: массива или одного значения script. Если это массив, он проходит через каждый элемент и загружает его. Если это не массив, то он просто загрузит один файл. Вы увидите эту часть через минуту.

Важные детали: См. Я создал массив в глобальной области (вне функции), называемой loadScripts. Поскольку это часть файла global.js, он никогда не перезагружается и может быть вызван из любого места. Но для наших целей я просто проверяю, находится ли уже загруженное имя script в массиве, используя:

if($.inArray(objValue, loadedScripts) < 0){

Поскольку функция 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>

Если все сделано правильно, вы заметите, что он загружается только один раз.

Ответ 3

Я создал плагин который делает почти то, что вы хотите: $.getScriptOnce().

Если вы попытаетесь загрузить тот же самый script два раза или больше, он не загрузит script и не вернет 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));

А затем просто вызовите $.getScriptOnce('yourFile.js')

Ответ 5

Я также написал такую ​​функцию. Вы можете протестировать вкладку Сеть в инструментах Firebug или Chrome dev. Это однократно загружает один и тот же файл.

Обратите внимание, чтобы не загружать второй раз сразу после предыдущего, потому что функция просто предполагает, что файл был загружен после вызова обратного вызова, то есть после того, как файл был загружен успешно.

var getScriptOnce = (function(url, callback) {
  var scriptArray = []; //array of urls
  return function (url, callback) {
      //the global array doesn't have such url
      if (scriptArray.indexOf(url) === -1){
          if (typeof callback === 'function') {
              return $.getScript(url, function(script, textStatus, jqXHR) {
                  scriptArray.push(url);
                  callback(script, textStatus, jqXHR);
              });
          } else {
              return $.getScript(url, function(){
                  scriptArray.push(url);
              });
          }
      }
      //the file is already there, it does nothing
      //to support as of jQuery 1.5 methods .done().fail()
      else{
          return {
              done: function () {
                  return {
                      fail: function () {}
                  };
              }
          };
      }
  }
}());

/*#####################################################################*/
/*#####################################################################*/


//TEST - tries to load the same jQuery file twice
var jQueryURL = "https://code.jquery.com/jquery-3.2.1.js";
console.log("Tries to load #1");
getScriptOnce(jQueryURL, function(){
  console.log("Loaded successfully #1")
});

//waits 2 seconds and tries to load again
window.setTimeout(function(){
  console.log("Tries to load #2");
  getScriptOnce(jQueryURL, function(){
    console.log("Loaded successfully #2");
  });
}, 2000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ответ 6

Не делай этого; не обрабатывайте тег <script> как ваш компилятор, загружающий исходный код. Вместо этого объедините весь исходный код, используя javascript minifier, и только поразите сервер один раз.

Загрузка одного 4k файла лучше, чем загрузка четырех файлов 1k, а minifier, возможно, лучше справится с этим. В любом случае, вам это не нужно. Ваш браузер кэширует эти модули в любом случае, и если вы не испортите конфигурацию своего сервера, он пойдет правильно.

Если вы действительно хотите продолжить, сначала посмотрите на библиотеки загрузки javascript, такие как Ensure, или Ajile или Dojo или JSAN. По крайней мере, вы не изобретаете колесо.

По-прежнему хотите сделать это сами? Вы можете либо проверить что-то, что contacts.js, либо использовать переменную, чтобы проверить, сделали ли вы это. Если contacts.js имеет в нем что-то вроде этого:

function ContactsLoaded(){...}

Вы можете сделать:

if(typeof ContactsLoaded=='undefined')$.getScript('contacts.js');

В качестве альтернативы вы можете установить его самостоятельно и выполнить функцию загрузчика:

function getScriptOnce(f){
  var a=getScriptOnce;
  if(typeof a[f]=='undefined')$.getScript(f);
  a[f]=true;
}