Два разных тега script для Google Analytics?

Кто-нибудь знает, почему Google Analytics требует два отдельных тега script?

В частности, их инструкции советуют пользователям встраивать следующий фрагмент кода в веб-страницу для отслеживания:

<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

Почему пользователи не могут использовать только один блок script следующим образом:

<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

Ответ 1

Теги

<script> выполняются последовательно. Блок <script> не может выполняться, если предыдущий не выполнен.

Первый тэг <script> отвечает за создание тега Google <script>, который загрузит внешние js. После завершения первого <script> выполнения DOM выглядит следующим образом:

<script></script> <!-- First Script Tag -->
<script></script> <!-- Google Injected Script -->
<script></script> <!-- Second Script Tag -->

Это гарантирует, что второй тег <script> не будет выполняться до тех пор, пока не будет выполнена загрузка .js. Если первый и второй <script> будут объединены, это приведет к тому, что переменная _gat будет undefined (поскольку введенный Google script не начнет загружаться до тех пор, пока не будет выполнен первый script).

Ответ 2

document.write происходит, как только он выполняется в коде. Поэтому, если бы мы использовали ваш блок "один script", фактический сгенерированный исходный код выглядел бы следующим образом:

<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script>

Следовательно, код var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview(); завершится с ошибкой, потому что _gat не будет определен до загрузки файла ga.js.

Это имеет смысл?

Ответ 3

Первый блок на самом деле использует JavaScript для написания целого нового тега script inline для замены тега script. Он выполняет проверку, чтобы убедиться, что вы используете "https" на запрашиваемой странице, и если да, чтобы использовать свой безопасный URL-адрес для запроса script, или ваш браузер может отображать "Части этой страницы небезопасны - отображать защищенные элементы?" или отказаться от выполнения вызова вообще.

Если второй тег script был включен в первый, он будет удален и/или не будет хорошо сформированным тегом script, и ваш код должен будет смешивать с их.

Таким образом, вы можете просто выполнять все ваши вызовы в trackPageView и задавать свойства и т.д. в своих собственных блоках чисто и по-прежнему правильно работать через http и https.

Итак, когда страница будет отображаться, DOM будет выглядеть так, как только первый script выполняет (обычный http):

<!-- Google Analytics -->
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script>

<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

И это (https):

<!-- Google Analytics -->
<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script>

<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

Подробнее: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

Ответ 4

Я подозреваю, что это попытка избежать неясных проблем браузера с использованием document.write для развертывания тега script.

Ответ 5

Для чего мы стоим, мы используем механизм onclick = "pageTracker._trackPageview (% filename%)" для отслеживания загрузки файлов напрямую, но все же не хотим отслеживать фактическое просмотрение страницы до тех пор, пока страница не будет полностью загружена, Мы должны включить 1-й тег в верхней части страницы, чтобы включить это, но оставим окончательный вызов _trackPageview() в конце (ну, мы тоже много с битом var pageTracker).

Не обязательно, почему они нарушают его таким образом, но это делает его немного легче для наших целей.