Используйте Google Analytics (асинхронная версия), чтобы отслеживать исходящие клики, не нарушая target = _blank - PullRequest
1 голос
/ 25 ноября 2010

Я хочу отслеживать клики пользователей по ссылкам на внешние сайты. Я рад использовать асинхронную версию GA, поскольку она позволяет (в большинстве браузеров) продолжать загрузку страницы вместо остановки в теге script и ожидания загрузки и выполнения google-analytics.com/ga.js. *

Google рекомендует эту функцию:

<script type="text/javascript">
function recordOutboundLink(link, category, action) {
  try {
    var myTracker=_gat._getTrackerByName();
    _gaq.push(['myTracker._trackEvent', ' + category + ', ' + action + ']);
    setTimeout('document.location = "' + link.href + '"', 100)
  }catch(err){}
}
</script>

<a href="http://www.example.com" onClick="recordOutboundLink(this, 'Outbound Links', 'example.com');return false;">

Проблемы с этим решением:

  • Это может занять 10 мс, для отслеживания события может потребоваться 300 мс, но это изменит страницу через 100 мс независимо от того, что произойдет. И если отслеживание будет слишком медленным, страница изменится до того, как будет отслежена.
  • document.location = означает, что исходная ссылка игнорируется, и поэтому target = _blank не открывает новые вкладки / окна.

1 Ответ

1 голос
/ 26 ноября 2010

Возможные решения:

  • Ожидание занято (do {curDate=new Date();} while(curDate-date<millis)) в течение 100 мс, пока отслеживание имеет возможность отправить свой запрос, затем вернет true . Плохо, потому что занятое ожидание потребляет весь доступный процессор.
  • Используйте window.open, чтобы можно было открывать новые вкладки / окна, что приводит меня к моему текущему фавориту:

  • В обработчике кликов используйте $(this).attr("target", "_blank");, а затем просто return true после нажатия команды отслеживания на _gaq.

Это работает, потому что открытие новой вкладки оставляет текущую вкладку, чтобы завершить выполнение отслеживания вызова.

$(document).ready(function(){
  var localserver = document.location.hostname;
  // unfortunately misses if any uppercase used in link scheme
  $("a[href^=http://],a[href^=https://]") 
    .not("a[href^=http://"+localserver+"]")
    .not("a[href^=http://www."+localserver+"]")
    .click(function(e){
        $(this).attr("target", "_blank");
        _gaq.push(['_trackEvent', 
                   'Outgoing Click',
                   $(this).attr("href"),
                   $(this).text()
                 ]);
        return true;
    });
});

С одним небольшим недостатком - всегда открывать новую вкладку для внешних ссылок, я не вижу никаких других проблем.

...