2015-07-05 4 views
2

Я пытаюсь написать некоторый код обратного кода скрипта, чтобы, если jQuery и jQuery Validator недоступны из CDN, я загружаю локальную версию. Обратите внимание, что следующий сценарий находится в отдельном файле для поддержки политики безопасности контента (CSP).Как подождать document.write для завершения

(window.jQuery || document.write('<script src="/js/jquery.js"><\/script>')); 
($.validator || document.write('<script src="/js/jquery-validate.js"><\/script>')); 

Если JQuery не доступен новый тег сценария записывается в конец документа, но тогда ошибки следующей строки о том, что $ является неопределенным. Как я могу дождаться завершения записи документа до загрузки документа до выполнения следующей строки?

+1

Удалены [тег: JQuery-Validate] тег, так как вопрос/вопрос/решение не имеет никакого отношения, в частности, чтобы сделать с этим плагином и может применяться к любой CDN принимал скрипт. – Sparky

ответ

4

Вы должны использовать событие onload<script>. Вместо ducoment.write, добавьте тег сценария в документ с помощью манипулирования DOM:

var s = document.createElement('script'); 
s.onload = function() { 
    // jQuery is now loaded and can be used 
} 
s.src = '/js/jquery.js'; 
document.getElementsByTagName('head')[0].appendChild(s); 

UPDATE:

Ответ на ваш вопрос: «как ждать document.write» это вам не нужно, потому что document.write является синхронным. Следующая строка после document.write будет выполняться только после завершения записи. Однако, если вы пишете тег <script> в документе с атрибутом src, загрузка ресурса (где src указывает) будет асинхронной и начнется после завершения записи в paralell со следующими операциями. Поскольку невозможно заранее сказать, как долго будет загружаться ресурс, единственный жизнеспособный подход, чтобы убедиться, что все доступно из внешнего скрипта, - это событие onload.

+1

@zlumer Спасибо, опечатка исправлена, см. Мое обновление. – marekful

+1

thanks, upvoted & удаление моего комментария как устаревшего. – zlumer

3

document.write уже блокирует выполнение до тех пор, пока информация не будет проанализирована и обработана. Поэтому для вашего примера не требуется никакого дополнительного кода.

С другой стороны, я бы рекомендовал использовать DOM-инъекцию вместо document.write. document.write задерживает обработку CSS и может вызвать FOUC (Вспышка неровного содержимого).

DOM инъекция может быть сделано следующим образом:

var scriptElm = document.createElement('script'); 
scriptElm.src = '/js/jquery.js'; 
document.getElementsByTagName('head')[0].appendChild(scriptElm); 

// Check if jQuery is loaded here 
+1

Но в тот момент, когда комментарий вашего кода говорит «проверьте, загружен ли jQuery», OP должен дождаться его загрузки. Как ты это делаешь? – nnnnnn

+0

Так как же $ не определено на второй строке? –

+3

@RehanSaeed '$' 'undefined' до тех пор, пока * скрипт не будет загружен *. Вызов 'document.write()' завершен успешно, но сценарий еще не загружен, когда выполняется вторая строка – zlumer