17

几个月来,我一直在使用脚本来跟踪出站链接。该脚本 WORKS,但在 Google Analytics 生成的报告中,许多 URL 的末尾都有一个尾随“:80”(默认端口号)。请阅读以获得更多详情。

值得一提的是,跟踪这些出站链接的网站有大量的出站流量(将您的幻想乘以∞)。

脚本的目的

它跟踪所有出站链接并将它们标记为谷歌分析中的“出站链接”。

该脚本被大量注释,并且有一些 console.log() 实例来帮助调试(这些都被注释掉了)。

“出站链接”显示在 GA 上,如下:

内容 > 事件 > 热门事件 > “出站链接” [点击它] > [报告显示所有点击的 url]

问题

在“出站链接”报告下,我得到了所有被点击的链接,我在至少 2/3 报告的链接(可能更多)的末尾得到“:80”。GA 将http://example.comhttp://example.com:80视为不同的链接,在报告中将它们分开。这当然是不希望的。

值得一提:

以“:80”结尾的链接总是比没有“:80”的链接有更多的点击率,点击率高出 40% 到 60%。

想要的解决方案

  • 将以“:80”结尾的链接与没有它的链接合并,或者
  • 如果可能,请避免将“:80”附加到链接。
  • 奖励:了解为什么我们得到以“:80”结尾的链接。

剧本

// Outbound Link Tracking with Google Analytics
// Requires jQuery 1.7 or higher (use .live if using a lower version)
$(function() {
    $("a").on('click',function(e){
        var url = $(this).attr("href");
        // Console logs shows the domain name of the link being clicked and the current window
        // console.log('e.currentTarget.host: ' + e.currentTarget.host);
        // console.log('window.location.host: ' + window.location.host);
        // If the domains names are different, it assumes it is an external link
        // Be careful with this if you use subdomains
        if (e.currentTarget.host != window.location.host) {
            // console.log('external link click');
            // Outbound link! Fires the Google tracker code.
            _gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host, url, 0);
            // Checks to see if the ctrl or command key is held down
            // which could indicate the link is being opened in a new tab
            if (e.metaKey || e.ctrlKey) {
                // console.log('ctrl or meta key pressed');
                var newtab = true;
            }
            // If it is not a new tab, we need to delay the loading
            // of the new link for a just a second in order to give the
            // Google track event time to fully fire
            if (!newtab) {
                // console.log('default prevented');
                e.preventDefault();
                // console.log('loading link after brief timeout');
                setTimeout('document.location = "' + url + '"', 100);
            }
        }
        /*
        else {
            console.log('internal link click');
        }
        */
    });
});
4

7 回答 7

12

Fresheyeball 的答案是正确的,但是因为很多人一直在要求一个完整的答案,所以我将发布带有 Fresheyeball 贡献的最终脚本。

短版

// Outbound Link Tracking with Google Analytics
// Wallace Sidhrée - http://dreamyguy.com/
// Requires jQuery 1.7 or higher (use .live if using a lower version)
$(function() {
    $("a").on('click',function(e){
        var url = $(this).attr("href");
        if (e.currentTarget.host != window.location.host) {
            _gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host.replace(':80',''), url, 0);
            if (e.metaKey || e.ctrlKey || this.target == "_blank") {
                var newtab = true;
            }
            if (!newtab) {
                e.preventDefault();
                setTimeout('document.location = "' + url + '"', 100);
            }
        }
    });
});

完整版本(已注释且“可调试”)

// Outbound Link Tracking with Google Analytics
// Wallace Sidhrée - http://dreamyguy.com/
// Requires jQuery 1.7 or higher (use .live if using a lower version)
$(function() {
    $("a").on('click',function(e){
        var url = $(this).attr("href");
        // Console logs shows the domain name of the link being clicked and the current window
        // console.log('e.currentTarget.host: ' + e.currentTarget.host);
        // console.log('window.location.host: ' + window.location.host);
        // If the domains names are different, it assumes it is an external link
        // Be careful with this if you use subdomains
        if (e.currentTarget.host != window.location.host) {
            // console.log('external link click');
            // Outbound link! Fires the Google tracker code.
            _gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host.replace(':80',''), url, 0);
            // Checks to see if the ctrl or command key is held down
            // which could indicate the link is being opened in a new tab
            // Also checks if target="_blank" on the link tag which indicates it should always be opened in a new tab
            if (e.metaKey || e.ctrlKey || this.target == "_blank")) {
                // console.log('ctrl or meta key pressed');
                var newtab = true;
            }
            // If it is not a new tab, we need to delay the loading
            // of the new link for a just a second in order to give the
            // Google track event time to fully fire
            if (!newtab) {
                // console.log('default prevented');
                e.preventDefault();
                // console.log('loading link after brief timeout');
                setTimeout('document.location = "' + url + '"', 100);
            }
        }
        /*
        else {
            console.log('internal link click');
        }
        */
    });
});
于 2013-02-09T10:30:36.280 回答
5

输出中的原因:80是因为e.currentTarget.host

http://www.w3schools.com/jsref/prop_area_host.asp

我不知道你为什么除了你已经功能的变量之外还要跟踪它,但你总是可以通过简单的字符串替换url来确保它不存在:80

_gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host.replace(':80',''), url, 0);

于 2012-09-06T15:30:00.457 回答
3

window.open 的问题是引用者将丢失。更好的解决方案是使用 onmousedown 而不是 onclick。做了一些测试后,我知道这比使用 window.open 或使用 setTimeout 更好。您从人们单击鼠标右键而不选择“在新选项卡中打开”或“在新窗口中打开”得到一些误报,但是 onclick 并不总是在所有浏览器上单击鼠标右键时触发。这是两个邪恶中较小的一个选择。

jQuery(function($){
  $('a:not([href*="' + document.domain + '"])').mousedown(function(event){
    // Just in case, be safe and don't do anything
    if (typeof _gat == 'undefined') {
      return;
    }

    var link = $(this);
    var href = link.attr('href');
    var noProtocol = href.replace(/http[s]?:\/\//, '');

    // Track the event
    _gat._getTrackerByName()._trackEvent('Outbound Links', noProtocol);
   });
});
于 2013-04-04T01:41:44.480 回答
2

使用 location.hostname 而不是 location.host 。主机名不包括端口。

于 2013-06-26T08:06:35.213 回答
1

这段小代码对我有用:

    var hostname = window.location.hostname; 

    jQuery("body a").click(function(){

          if(jQuery(this).attr("href").indexOf(hostname)== -1){

               ga('send', 'event', {'eventCategory': "Outbound Links", 'eventAction': "OnClick", 'eventLabel': jQuery(this).attr("href")});

          }
    });
于 2014-10-01T13:39:05.593 回答
1

Google 有一个官方支持的库,可以为您完成这些工作。

https://github.com/googleanalytics/autotrack

因此,您的整个 Analytics 代码段将类似于:

<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');

// Replace the following lines with the plugins you want to use.
ga('require', 'eventTracker');
ga('require', 'outboundLinkTracker');
ga('require', 'urlChangeTracker');
// ...

ga('send', 'pageview');
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
<script async src="path/to/autotrack.js"></script>
于 2017-10-04T18:53:27.287 回答
1

这是我使用Google 建议代码的解决方案

将其放在您的 GA 跟踪代码之后(可能在<head>

// TRACK OUTBOUND LINKS
document.addEventListener("DOMContentLoaded", function() {
    var trackOutboundLink = function(url) {
       ga('send', 'event', 'outbound', 'click', url, {
         'transport': 'beacon',
         'hitCallback': function(){document.location = url;}
       });
    }

    var a = document.getElementsByTagName('a');

    for(i = 0; i < a.length; i++){
        if (a[i].href.indexOf(location.host) == -1 && a[i].href.match(/^http?s:\/\//i)){
            a[i].onclick = function(){
                trackOutboundLink(this.href);
            }
        }
    }
});
// END
于 2018-05-15T09:54:03.597 回答