Вопрос

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

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

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

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

<!-- 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> выполняются последовательно. .js Блок не может быть выполнен, если предыдущий не завершен.

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

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

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

Другие советы

document.write происходит, как только он выполняется в коде. Так что, если мы использовали ваш & Quot; один блок скрипта & Quot; Например, фактический сгенерированный исходный код будет выглядеть примерно так:

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

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

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

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

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

Таким образом, при отображении страницы DOM будет выглядеть после выполнения первого сценария (обычный 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 / аналитика / документы / слежение / gaTrackingOverview.html

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top