Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Зачем в теге <script> создавать другой тег <script>? (https://javascript.ru/forum/misc/35842-zachem-v-tege-script-sozdavat-drugojj-teg-script.html)

hrundel 24.02.2013 09:21

Зачем в теге <script> создавать другой тег <script>?
 
Зачем в HTML-кодах, вставляемых с других сайтов (например, счётчиках посетителей), используется html-тег <script>...</script>, внутри которого на js создаётся ещё один тег <script>, и только в нём происходит подключение нужного js-файла?

Как например это делается в случае с подключением плагинов фесбука:
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>


Такое же можно увидеть, например, и в Яндекс метрике, и в Google Analytics.
Не проще ли просто подключать js-файл из самого первого тега <script>?

danik.js 24.02.2013 13:03

Я думаю это делается для асинхронной загрузки скрипта. Если забить на старые браузеры, то можно просто писать
<script src="//connect.facebook.net/ru_RU/all.js#xfbml=1" id="facebook-jssdk" async=""></script>

hrundel 24.02.2013 19:46

Так, наверное, правильнее.
<script src="//connect.facebook.net/ru_RU/all.js#xfbml=1" id="facebook-jssdk" async="async"></script>

danik.js 24.02.2013 20:00

Цитата:

Сообщение от hrundel
Так, наверное, правильнее.

Не более правильно чем мой вариант. Это булев атрибут.
Есть и третий способ его указать (но он не совместим с xhtml синтаксисом):
<script async></script>

rgl 25.02.2013 13:52

Может, чтобы бороться с хитрецами, которые для накрутки посещаемости устанавливают один и тот же счетчик по несколько раз на страницу?
if (d.getElementById(id)) return;

hrundel 25.02.2013 18:13

А тогда ещё вопрос появился. В DOM-дереве подключаемый таким образом тег <script>...</script> присутствует, хотя в html-коде страницы его нет. В какой момент js-файл будет загружен в браузер? Ведь браузер сначала загружает все скрипты, находящиеся в теге <head>...</head>, а потом продолжает загрузку страницы. Если это так, то подключаемый от фейсбука js-файл будет пропущен (если код вставляется в конец страницы)? Или я что-то не так понимаю?

danik.js 25.02.2013 18:24

Все скрипты выполняются последовательно (и в head, и в body - разницы нет). При выполнении (и загрузке) разбор документа приостанавливается. Однако скрипт, добавленный в DOM динамически - работает асинхронно. Как я сказал - я думаю ради этого всякие фэйсбуки так и делают.

Цитата:

Сообщение от hrundel
Или я что-то не так понимаю?

Не понимаешь. Скрипт просто диманически создатся, загрузится и по загрузке исполнится. Так что все будет работать.


Часовой пояс GMT +3, время: 18:33.