В приведенном ниже коде,
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Falback procedure</title>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">
</script>
<script type="text/javascript">
if(typeof jQuery === 'undefined')
document.write('<script type="text/javascript" src="../localfolder/jquery.js"></script>');
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.0/angular2.js">
</script>
</head>
<body>
<p>Hello</p>
</body>
</html>
с учетом сценария, когда в google CDN возникают проблемы с доступностью, которые запускают резервный механизм загрузки локальной библиотеки jQuery (сидя на веб-сервере).
В таком сценарии загружается ли библиотека angularjs? после выполнения document.write
У вас есть две проблемы с этим кодом, которые могут привести к тому, что он не будет вести себя так, как вы ожидаете:
У вас есть буквальный </script>
внутри блока сценария. Не имеет значения, что он внутри строки, он завершает блокировку. Вы должны разбить его, чтобы браузер не видел его как конец блока:
<script type="text/javascript">
if(typeof jQuery === 'undefined')
document.write('<script type="text/javascript" src="../localfolder/jquery.js"><\/script>');
// Note the \------------------------------------------------------------------^
</script>
\
Есть не имеет смысла в JavaScript, но не дает браузеру видеть </script>
и, следовательно, от окончания блока сценария преждевременно. Другие способы, которые вы видите, это '....<' + '/script>'
или '...</scr' + 'ipt>'
и т.д.
Ваш src
на Angular script неверен, поэтому он не будет работать, загружается ли jQuery или нет (или откуда). Вы указали URL-адрес относительно пути к странице, но вам нужно сделать его как минимум по отношению к протоколу, добавив //
:
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.0/angular2.js">
</script>
<!-- here --------------------------^ -->
В комментарии вы спросили
Мне было интересно, был ли
document.write
асинхронным выполнением
Нет, это происходит сразу же после запуска функции. В вашем случае, поскольку функция находится на верхнем уровне тега script
без каких-либо специальных атрибутов, парсер HTML должен визжать до упора и запускать этот код JavaScript, обрабатывая любые токены, выводимые кодом JavaScript через document.write
, и ожидая пока код JavaScript не закончится до перехода на угловую часть.
В браузере вполне возможно выполнить предварительную angular.js
файла angular.js
, но он не будет выполнять содержимое этого файла до тех пор, пока парсер не достигнет этого тега script
файла, поскольку порядок выполнения сценариев четко определен ( например, в порядке документа), если вы не используете атрибуты async
или defer
.
Angularjs
иjquery
загружаются из разныхCDNs
иAngularJs
не нуждается вjquery.js
для работы или, лучше сказать,AngularJs
не зависит отjquery.js
.