Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript xdomain.js跨域链接脚本的jQuery indexOf错误_Javascript_Jquery_Google Analytics_Cross Domain - Fatal编程技术网

Javascript xdomain.js跨域链接脚本的jQuery indexOf错误

Javascript xdomain.js跨域链接脚本的jQuery indexOf错误,javascript,jquery,google-analytics,cross-domain,Javascript,Jquery,Google Analytics,Cross Domain,我正在使用一个脚本来检测谷歌分析跨域跟踪的跨域链接。最初的脚本(xdomain.js)是由Luna Metrics的伟人提供的。下面是我修改过的脚本,请参见StackOverflow上的educardocereto,了解在GATC中启用setAllowAnchor的建议更改(我已经注释了控制台错误首先指向的第40行): Chrome javascript控制台的输出: Uncaught TypeError: Cannot call method 'indexOf' of undefined

我正在使用一个脚本来检测谷歌分析跨域跟踪的跨域链接。最初的脚本(xdomain.js)是由Luna Metrics的伟人提供的。下面是我修改过的脚本,请参见StackOverflow上的educardocereto,了解在GATC中启用setAllowAnchor的建议更改(我已经注释了控制台错误首先指向的第40行):

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实例。我还用jQuery1.7.1进行了尝试。我之所以使用1.2.6,是因为该脚本似乎已经在该版本上进行了大量测试。

这里您可以缓存jqueryized元素和href attr

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是否未定义

我在jQuery1.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();
});
但你可能正在重新发明轮子。有一些更好的脚本可以实现同样的效果。我想你可能有兴趣调查一下。它是一个围绕ga.js的包装器,扩展并添加了一系列内容,包括跨域和下载跟踪

剧透:我是这部电影的主要开发者


我刚下载了GAS;哇--看起来这就是我现在要用的。。。Brian Clifton最近加入了Advanced Web Metrics group re scroll tracking(我看到GAS也在这样做)。GAS中有什么东西需要注意的吗?关于setAllowAnchor切换到“#”分隔符?GAS在_setAllowah方面非常聪明。如果您使用[''u setAllowash',true],那么所有xdomain链接都将被标记为与此相关。如果你发现有什么问题,请告诉我。这是我公司的一个项目,所以我们非常认真地对待bug,并且倾向于快速修复它们嗨Eduardo-你的意思是我认为setAllowAnchor不是SetAllowash(不推荐)?是的,对不起,我的意思是_setAllowAnchor。你说得对(u setallowash已弃用,不用于煤气)
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();
});