Два разных тега 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).
Не обязательно, почему они нарушают его таким образом, но это делает его немного легче для наших целей.