Два отдельных тега скрипта для Google Analytics? - PullRequest
15 голосов
/ 31 июля 2009

Кто-нибудь знает, почему 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>

Ответы [ 5 ]

18 голосов
/ 31 июля 2009
Теги

<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 не была определена (поскольку внедренный Google скрипт не начнет загружаться, пока не выполнится первый скрипт).

5 голосов
/ 31 июля 2009

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

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

Имеет ли это смысл?

1 голос
/ 31 июля 2009

В первом блоке фактически используется JavaScript для написания целого нового встроенного тега сценария для замены этого тега сценария. Он проверяет, используете ли вы «https» на запрашиваемой странице и, если да, использовать их безопасный 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/analytics/docs/tracking/gaTrackingOverview.html

0 голосов
/ 31 июля 2009

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

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

0 голосов
/ 31 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...