Загружается ли angularjs при восстановлении jQuery?

0

В приведенном ниже коде,

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

  • 4
    Почему бы его не загрузить?
  • 5
    Angularjs и jquery загружаются из разных CDNs и AngularJs не нуждается в jquery.js для работы или, лучше сказать, AngularJs не зависит от jquery.js .
Показать ещё 4 комментария

1 ответ

3

У вас есть две проблемы с этим кодом, которые могут привести к тому, что он не будет вести себя так, как вы ожидаете:

  1. У вас есть буквальный </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>' и т.д.

  2. Ваш 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню