Как запустить резервную копию jQuery после загрузки DOM? - PullRequest
3 голосов
/ 23 октября 2011

Ниже приведены первые строки кода в теге <script> чуть выше закрывающего тега body в моем документе (это указывает на то, что локальная копия jQuery запускается в случае сбоя CDN Google):

if(!window.jQuery){
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '/js/jquery.js';
    var scriptHook = document.getElementsByTagName('script')[0];
    scriptHook.parentNode.insertBefore(script, scriptHook);
}


jQuery(document).ready(function($){
// page behaviors
});

Он успешно выполняется, в том смысле, что, если мой компьютер не подключен к Интернету (это локально обслуживаемая страница), вставляется локальная копия jQuery. Тем не менее, раздел document.ready() ниже не выполняется. Я предполагаю, что это потому, что он вызывается до того, как резервная копия jQuery вступит в силу. Как правильно «задерживать» выполнение, чтобы любая копия jQuery работала правильно?

Ответы [ 5 ]

3 голосов
/ 23 октября 2011

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

1 голос
/ 23 октября 2011

Вы должны быть уверены, что скрипт, который вы добавляете в dom, завершил загрузку перед вызовом jQuery.Вы можете сделать это с помощью техники , описанной здесь :

if(!window.jQuery){
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '/js/jquery.js';
    script.onreadystatechange= function () {
      if (this.readyState == 'complete') jQueryLoaded();
    }
    script.onload = jQueryLoaded;
    var scriptHook = document.getElementsByTagName('script')[0];
    scriptHook.parentNode.insertBefore(script, scriptHook);
}

function jQueryLoaded() {  };

Вы также можете извлечь содержимое jQuery в виде Ajax-запроса, создать тег сценария с такими же, как тело сценария, идобавь это.Это также сработало бы.

0 голосов
/ 24 октября 2011

Вопрос о том, как мне справиться со сбоем CDN и загрузить файл, размещенный на моем сервере, в последнее время, похоже, возникает несколько раз.

Вопрос, который я задам, заключается в том, добавляю ли еще больше jsспособ достижения устойчивости и какой уровень устойчивости действительно добавляют js-подходы, например, если CDN не работает, это будет быстрый сбой, но насколько хороши эти подходы, если CDN медленно реагирует, насколько хорошо эти решения справляются?

Альтернативный способ решения этой проблемы - рассматривать ее как проблему инфраструктуры ...

Запуск CDN на основе домена / субдомена, которым вы владеете.Автоматически контролировать доступность, при сбое переключать DNS на резервный сервер (anycast также может предоставить альтернативное решение)

0 голосов
/ 23 октября 2011

Попробуйте это

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.2.min.js"><\/script>')</script>
<script>
    jQuery(document).ready(function($){
        // page behaviors
    });
</script>

Таким образом, тег скрипта будет загружен синхронно.

0 голосов
/ 23 октября 2011

PHP-решение будет выглядеть примерно так:

$google_jquery = 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';
$fp = @fsockopen($google_jquery, 'r');
if (!$fp) 
{
    echo '<script type="text/javascript" src="js/jquery.js"></script>';
} 
else
{ 
    echo '<script src="'.$google_jquery.'"></script>' }
}
...