Зачем в теге <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>? |
Я думаю это делается для асинхронной загрузки скрипта. Если забить на старые браузеры, то можно просто писать
<script src="//connect.facebook.net/ru_RU/all.js#xfbml=1" id="facebook-jssdk" async=""></script> |
Так, наверное, правильнее.
<script src="//connect.facebook.net/ru_RU/all.js#xfbml=1" id="facebook-jssdk" async="async"></script> |
Цитата:
Есть и третий способ его указать (но он не совместим с xhtml синтаксисом): <script async></script> |
Может, чтобы бороться с хитрецами, которые для накрутки посещаемости устанавливают один и тот же счетчик по несколько раз на страницу?
if (d.getElementById(id)) return; |
А тогда ещё вопрос появился. В DOM-дереве подключаемый таким образом тег <script>...</script> присутствует, хотя в html-коде страницы его нет. В какой момент js-файл будет загружен в браузер? Ведь браузер сначала загружает все скрипты, находящиеся в теге <head>...</head>, а потом продолжает загрузку страницы. Если это так, то подключаемый от фейсбука js-файл будет пропущен (если код вставляется в конец страницы)? Или я что-то не так понимаю?
|
Все скрипты выполняются последовательно (и в head, и в body - разницы нет). При выполнении (и загрузке) разбор документа приостанавливается. Однако скрипт, добавленный в DOM динамически - работает асинхронно. Как я сказал - я думаю ради этого всякие фэйсбуки так и делают.
Цитата:
|
Часовой пояс GMT +3, время: 18:33. |