2012-02-03 58 views
0

我正在使用腳本爲谷歌分析跨域跟蹤檢測跨域鏈接。原始腳本(xdomain.js)由Luna Metrics的優秀人員提供。這裏是我的修改,帽尖的腳本來這裏educardocereto在計算器上的修改建議,以便能夠在GATC setAllowAnchor(我的註釋行40,在控制檯錯誤第一點):針對xdomain.js跨域鏈接腳本的jQuery indexOf錯誤

var jQueryXD = jQuery.noConflict(); 
/* I added var because page loads 2 versions 
    of jquery - not the source of the problem.*/ 

function listenToClicks() 
{ 
    var domains=["domain1.com", "domain2.com"]; 
    var fileTypes=[".pdf"]; 

    jQueryXD('a').each(function(index) { 
     var link = jQueryXD(this); 
     var href = link.attr('href'); 

     jQueryXD.each(fileTypes, function(i) { 
      if(jQueryXD(link).attr('href').indexOf(this)!=-1){ //this is line 40 
       valid = false; 
       jQueryXD(link).bind('click', function(c) { 
        c.preventDefault(); 
        _gat._getTrackerByName()._trackEvent('Download', 'Click - ' +  jQueryXD(link).attr('href')); 
        setTimeout('document.location = "' + jQueryXD(link).attr('href') + '"', 100); 
       }); 
      } 
     }); 

     var valid = false; 
     jQueryXD.each(domains, function(j) { 
      try 
      { 
       if((jQueryXD(link).attr('href').indexOf(this)!=-1)&&(window.location.href.indexOf(this)==-1)){ 
        valid = true; 

        if (valid) 
        { 
         jQueryXD(link).bind('click', function(l) { 
          if(typeof(_gat)=="object"){ 
           l.preventDefault(); 
           if (jQueryXD(link).attr('target') != "_blank") 
           {        // _gaq.push(['_link',jQueryXD(link).attr('href')]); 
            _gaq.push(['_link',jQueryXD(link).attr('href'), true]); // mod 
           } 
           else 
           { 
            var tracker = _gat._getTrackerByName(); 
            //var fullUrl = tracker._getLinkerUrl(jQueryXD(link).attr('href')); 
            var fullUrl = tracker._getLinkerUrl(jQueryXD(link).attr('href'), true); //mod 
            window.open(fullUrl); 
           } 
          } 
         }); 
        } 
       } 

      } 
      catch(e) 
      { 
       //Bad A tag 
      }   
     }); 

     var rootDomain = document.domain.split(".")[document.domain.split(".").length - 2] + "." + document.domain.split(".")[document.domain.split(".").length - 1]; 

     if ((href.match(/^http/)) && (href.indexOf(rootDomain) == -1) && !valid) { 
      jQueryXD(link).bind('click', function(d) { 
        d.preventDefault(); 
        _gat._getTrackerByName()._trackEvent('Outbound Link', href); 
        setTimeout('document.location = "' + href + '"', 100); 
       });    
     } 
    }); 

} 

jQueryXD(document).ready(function() { 
    listenToClicks(); 
}); 

的從Chrome的JavaScript控制檯輸出:

Uncaught TypeError: 
Cannot call method 'indexOf' of undefined  xdomain-nfi-nfs-anchormod-noconflict.js:40 
    jQueryXD.each.valid       xdomain-nfi-nfs-anchormod-noconflict.js:40 
    jQuery.extend.each       jquery-1.2.6.min.js:21 
    (anonymous function)       xdomain-nfi-nfs-anchormod-noconflict.js:39 
    jQuery.extend.each       jquery-1.2.6.min.js:21 
    jQuery.fn.jQuery.each      jquery-1.2.6.min.js:12 
    listenToClicks        xdomain-nfi-nfs-anchormod-noconflict.js:35 
    (anonymous function)       xdomain-nfi-nfs-anchormod-noconflict.js:100 
    jQuery.fn.extend.ready      jquery-1.2.6.min.js:27 
    jQuery.extend.ready.jQuery.readyList   jquery-1.2.6.min.js:27 
    jQuery.extend.each       jquery-1.2.6.min.js:21 
    jQuery.extend.ready       jquery-1.2.6.min.js:27 

因此,至少它似乎沒有混合了兩個jQuery的實例。我也試過用jquery 1.7.1。我使用的是1.2.6,因爲腳本似乎已經在該版本上進行過測試。

回答

1

在這裏你緩存jQuerified元素和href屬性。

var link = jQueryXD(this); 
var href = link.attr('href'); 

比你爲什麼後來做到這一點:

jQueryXD(link).attr('href').indexOf(this) 

你既可以調用link.attr('href').indexOf(this)因爲link已經是一個jQuery對象或者你可以直接使用你的緩存href和做到這一點href.indexOf(this)

我仍然認爲,當鏈接沒有href屬性時,會發生錯誤。所以你最好在繼續你的邏輯之前檢查一下href是不是未定義的。

我在jQuery 1.2.6和1.7上測試了它。它似乎工作正常。

這是完成的腳本。

var jQueryXD = jQuery.noConflict(); 
/* I added var because page loads 2 versions 
    of jquery - not the source of the problem.*/ 

function listenToClicks() { 
    var domains = ["domain1.com", "domain2.com"]; 
    var fileTypes = [".pdf"]; 

    jQueryXD('a').each(function(index) { 
     var link = jQueryXD(this); 
     var href = link.attr('href'); 
     if(!href){ 
      // This element doesnt have a href 
      return true; 
     } 

     var valid = false; 
     jQueryXD.each(fileTypes, function(i) { 
      if (href.indexOf(this) != -1) { //this is line 40 
       valid = false; 
       link.bind('click', function(c) { 
        c.preventDefault(); 
        _gat._getTrackerByName()._trackEvent('Download', 'Click - ' + link.attr('href')); 
        setTimeout('document.location = "' + href + '"', 100); 
       }); 
      } 
     }); 

     jQueryXD.each(domains, function(j) { 
      try { 
       if ((href.indexOf(this) != -1) && (window.location.href.indexOf(this) == -1)) { 
        valid = true; 

        if (valid) { 
         link.bind('click', function(l) { 
          if (typeof(_gat) == "object") { 
           l.preventDefault(); 
           if (link.attr('target') != "_blank") { // _gaq.push(['_link',jQueryXD(link).attr('href')]); 
            _gaq.push(['_link', href, true]); // mod 
           } 
           else { 
            var tracker = _gat._getTrackerByName(); 
            //var fullUrl = tracker._getLinkerUrl(href); 
            var fullUrl = tracker._getLinkerUrl(href, true); //mod 
            window.open(fullUrl); 
           } 
          } 
         }); 
        } 
       } 

      } 
      catch (e) { 
       //Bad A tag 
      } 
     }); 

     var rootDomain = document.domain.split(".")[document.domain.split(".").length - 2] + "." + document.domain.split(".")[document.domain.split(".").length - 1]; 

     if ((href.match(/^http/)) && (href.indexOf(rootDomain) == -1) && !valid) { 
      jQueryXD(link).bind('click', function(d) { 
       d.preventDefault(); 
       _gat._getTrackerByName()._trackEvent('Outbound Link', href); 
       setTimeout('document.location = "' + href + '"', 100); 
      }); 
     } 
    }); 

} 

jQueryXD(document).ready(function() { 
    listenToClicks(); 
}); 

但是你可能會在這裏重新發明輪子。有一些更好的腳本來實現相同的目的。我想你可能有興趣查看GAS。它是ga.js的一個包裝,它擴展並添加了一堆東西,包括crossDomain和downloadTracking。

劇透:我是GAS的主要開發者。

https://github.com/CardinalPath/gas

+0

我剛下載了GAS;哇 - 看起來這就是我現在要用的......最近有一個[LinkedIn post](http://www.linkedin.com/groupItem?view=&srchtype=discussedNews&gid=66386&item=91547917&type=member&trk=eml -anet_dig-b_pd-ttl-cn&ut = 0GksdAi443QR41)在Brian Web Clifton加入的高級Web度量組重新滾動跟蹤(我看到GAS也在這樣做)中。 – Conando 2012-02-05 00:15:26

+0

GAS中有什麼需要注意的是用setAllowAnchor來切換到'#'分隔符? – Conando 2012-02-05 00:47:32

+0

GAS在_setAllowHash方面非常聰明。如果您使用['_setAllowHash',true],那麼所有的xdomain鏈接都將被標記爲尊重這一點。如果您發現任何問題,請告訴我。這是我公司的一個項目,所以我們非常認真地對待錯誤並傾向於相當快地解決它們 – Eduardo 2012-02-05 08:34:36