Как запустить резервную копию jQuery после загрузки DOM?

Ниже приведены первые строки кода в <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 ответов

Решение

Вы должны быть уверены, что скрипт, который вы добавляете в 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-запроса, создать тег сценария с такими же тегами, как тело сценария, и добавить его. Это также будет работать.

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

Попробуй это

<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>

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

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

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

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

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

Решение 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>' }
}
Другие вопросы по тегам