Ищите исходный файл Javascript во втором месте, если первый не удается загрузить - PullRequest
2 голосов
/ 21 февраля 2012

Можно ли попытаться загрузить исходный файл javaScript из другого места, если он не загружается с первого раза?

Например, в файле HTML у меня может быть:

<script type="text/javascript" src="http://domain.com/javascript_file.js"></script>

Но если это не удастся загрузить, я мог бы попытаться загрузить файл из этого второго места:

<script src="directory/javascript_file.js" type="text/javascript"></script>

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Это возможно.

Я, вероятно, подхожу к этому так:

Сначала создайте функцию для загрузки скриптов.

function loadScript(src) {
    var s = document.createElement('script'), x;
    s.type = 'text/javascript';
    s.async = true;
    s.src = src;
    x = document.getElementsByTagName('script')[0]; 
    x.parentNode.insertBefore(x, s);
}

Этого достаточно для загрузкисценарии, но как мы узнаем, когда он закончил загрузку или вообще не загружался?

Давайте добавим два параметра обратного вызова (один для успеха и один для сбоя) и параметр тайм-аута.Нам также нужно будет прикрепить прослушиватель событий к нашему элементу script, чтобы запускать обратные вызовы при его загрузке.

function loadScript(src, onSuccess, onFail, timeout) {
    var s = document.createElement('script'), x, loaded;
    s.type = 'text/javascript';
    s.async = true;
    s.src = src;

    s.onload = s.onreadystatechange = function() {
        if (''+s.readyState).match(/^(|complete|loaded|uninitialized)$/) {
            loaded = true;
            onSuccess && onSuccess();
            s.onload = s.onreadystatechange = null;
        }
    }

    if (onFail) {
        setTimeout(function(){loaded || onFail();}, timeout || 5000);
    }

    x = document.getElementsByTagName('script')[0]; 
    x.parentNode.insertBefore(x, s);
}

Полное раскрытие:

  • Это полностью не проверено.
  • Первый блок кода оторван от Google Analytics, с немного менее уродливым кодом.
  • Второй блок кода оторван от yepnope после просмотра ответа Слейса, с немного более уродливым, ноболее кратко, код.
2 голосов
/ 21 февраля 2012

Я рекомендую вам использовать yepnope.js для этого.Вот пример использования jQuery:

yepnope({
  load: 'http:/­/ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
  complete: function () {
    if (!window.jQuery) {
      yepnope('local/jquery.min.js');
    }
  }
});

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

...