2012-03-01 3 views
44

Я создаю плагин jquery и хочу проверить, загружен ли внешний скрипт. Это для внутреннего веб-приложения, и я могу сохранить согласованное имя/расположение сценария (mysscript.js). Это также плагин ajaxy, который можно многократно вызывать на странице.Проверка загрузки внешнего скрипта

Если я могу проверить сценарий не загружен, я загрузить его с помощью:

jQuery.getScript() 

Как проверить скрипт загружен, потому что я не хочу, один и тот же сценарий, загруженный на странице Дополнительные чем один раз? Это что-то, что мне не нужно беспокоиться из-за кеширования скрипта?

Update: Я не могу контролировать, кто использует этот плагин в нашей организации и не может быть в состоянии обеспечить соблюдение, что сценарий уже не на странице с или без определенного ID, но имя сценария всегда будет в одном и том же месте с тем же именем. Я надеюсь, что могу использовать имя скрипта, чтобы убедиться, что он загружен.

ответ

101

Если скрипт создает какие-либо переменные или функции в глобальном пространстве вы можете проверить их существования:

внешнего JS (в глобальный масштаб) -

var myCustomFlag = true; 

А чтобы проверить, если это запустить:

if (typeof window.myCustomFlag == 'undefined') { 
    //the flag was not found, so the code has not run 
    $.getScript('<external JS>'); 
} 

Update

Вы можете проверить существование <script> тега путем выбора всех <script> элементов и проверок их src атрибутов:

//get the number of `<script>` elements that have the correct `src` attribute 
var len = $('script').filter(function() { 
    return ($(this).attr('src') == '<external JS>'); 
}).length; 

//if there are no scripts that match, the load it 
if (len === 0) { 
    $.getScript('<external JS>'); 
} 

Или вы можете просто испечь эту .filter() функциональности права в селектор:

var len = $('script[src="<external JS>"]').length; 
+0

Из голосов, иначе я бы добавил +1 к этому ответу. – shanabus

+0

Это был хороший ответ, к сожалению, метод jquery.getScript добавляет скрипт без указания источника. Поэтому я не смог его найти. Я использовал часть вашего ответа, чтобы решить эту проблему. +1. – AGoodDisplayName

+0

@AGoodDisplayName В обратном вызове для '$ .getScript()' вы можете установить глобальный флаг, который можно проверить: '$ .getScript (', function() {window.myCustomFlag = true;}')'. Затем вы можете просто проверить наличие определенного элемента '

3

Создать тег сценария с определенным идентификатором, а затем проверить, существует ли этот идентификатор?

В качестве альтернативы, прокрутите теги скриптов, проверяющие скрипт 'src' и убедитесь, что они еще не загружены с тем же значением, что и тот, которого вы хотите избежать?

Edit: следуя обратной связи, пример кода будет полезно:

(function(){ 
    var desiredSource = 'https://sitename.com/js/script.js'; 
    var scripts  = document.getElementsByTagName('script'); 
    var alreadyLoaded = false; 

    if(scripts.length){ 
     for(var scriptIndex in scripts) { 
      if(!alreadyLoaded && desiredSource === scripts[scriptIndex].src) { 
       alreadyLoaded = true; 
      } 
     } 
    } 
    if(!alreadyLoaded){ 
     // Run your code in this block? 
    } 
})(); 
+1

+1 за хороший ответ, прежде чем вопрос был обновлен – zeroef

+0

Это идеальное решение. Я рекомендую второй. –

+0

Было бы здорово, если бы можно было поставить код с этими идеями. –

4

Этот поток находится в верхней части тегов SO jquery FAQ и имеет огромное разнообразие методов для проверки exisitng сценария

Best way to use Google's hosted jQuery, but fall back to my hosted library on Google fail

Много обратной связи на различных методах

+0

хороший ответ, потому что еще один вопрос был в моей голове относительно CDN. +1 – AGoodDisplayName

6

Это было очень просто теперь, когда я понимаю, как это сделать, благодаря всем ответам для того, чтобы привести меня к решению. Мне пришлось отказаться от $ .getScript(), чтобы указать источник скрипта ... иногда делать вещи вручную лучше.

Решение

//great suggestion @Jasper 
var len = $('script[src*="Javascript/MyScript.js"]').length; 

if (len === 0) { 
     alert('script not loaded'); 

     loadScript('Javascript/MyScript.js'); 

     if ($('script[src*="Javascript/MyScript.js"]').length === 0) { 
      alert('still not loaded'); 
     } 
     else { 
      alert('loaded now'); 
     } 
    } 
    else { 
     alert('script loaded'); 
    } 


function loadScript(scriptLocationAndName) { 
    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = scriptLocationAndName; 
    head.appendChild(script); 
} 
2

Другой способ проверить внешний скрипт загружается или нет, вы можете использовать данных функцию JQuery и хранить флаг проверки. Пример как:

if(!$("body").data("google-map")) 
    { 
     console.log("no js"); 

     $.getScript("https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initilize",function(){ 
      $("body").data("google-map",true); 

      },function(){ 
       alert("error while loading script"); 
      }); 
     } 
    } 
    else 
    { 
     console.log("js already loaded"); 
    } 
+1

Хорошо работает для того, что мне нужно. благодаря –

1

Объединение несколько ответов из выше в простой в использовании функции

function GetScriptIfNotLoaded(scriptLocationAndName) 
{ 
    var len = $('script[src*="' + scriptLocationAndName +'"]').length; 

    //script already loaded! 
    if (len > 0) 
     return; 

    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = scriptLocationAndName; 
    head.appendChild(script); 
} 
Смежные вопросы