jQuery在IE中的ATTR函数问题

3
我正在使用 $(document).ready() 动态创建 javascript,并将其附加到页面上链接的 onclick 事件。我的 onclick javascript 用于生成事件函数,我将这些函数传递给 Google Analytics 以跟踪页面上的事件,例如单击横幅广告和下载 PDF 文件。除了 IE 浏览器之外,我从每个浏览器中获取这些事件的统计数据。因此,在 IE 中出现了问题(我已在页面上搜索和查找错误,但没有发现)。通常情况下,我会像 $("a").click ... do stuff... 这样做,但由于某种原因,我唯一能够使 Google Analytics 事件跟踪起作用的方法是直接将跟踪事件函数放在链接上。因此,我使用以下代码在页面加载后将跟踪事件函数注入到我的链接的 onclick 中。
// Tracks favorites on the home page.
    $("._gatHomePageFavorites").each
    (
        function(index)
        {
            var description = "Content ID: " + getParameterNamedID($(this).attr("href")) + " - " + $(this).children().first().attr("alt");
            $(this).attr("onclick","alert('1');_gaq.push(['_trackEvent', 'Favorites - Home Page', 'Icon Click','" + _gatCleanString(description) + "']);alert('2');");
        }
    );

我想我的问题是IE没有把我的代码放在onclick里。但我不知道有什么好方法在IE中查看生成的源代码。我已经尝试了一些在地址栏中使用的javascript函数来显示生成的源代码,假设它们有效,那么我的代码就没有将跟踪事件函数注入到我的链接的onclick中。我在Firefox的查看生成的源代码中看到了onclick中的跟踪事件函数。
作为另一个测试,您可以看到我在我的跟踪事件函数周围添加了警报。在Firefox中,两个警报都会触发,在IE中,两个警报都不会触发。
还有一个信息。我的Google Analytics未记录任何IE浏览器的事件。据我所知,我的问题不特定于IE的某个版本。
我该如何确定动态Javascript是否进入IE的onclick,然后我能做什么来使其进入IE的onclick?
更新: 为了简化问题并聚焦答案的方向,我删除了Google Analytics事件函数。现在,我只是在onclick中注入alert()。IE甚至不能触发警报。我已经尝试过以下方法...
// Tracks favorites on the home page.
    $("._gatHomePageFavorites").each
    (
        function(index)
        {
            $(this).attr("onclick","alert('1')");
        }
    );

并且

// Tracks favorites on the home page.
    $("._gatHomePageFavorites").each
    (
        function(index)
        {
                $(this).attr("onclick","setTimeout(\"alert('1')\", 1000);return false");
        }
    );

所以我还是倾向于认为我的javascript没有被注入到IE的onclick中。

在IE中查看生成的源代码的最可靠方法是什么?

如果我能确认我的代码没有被注入到链接的onclick属性中,那么我至少可以知道为什么Google Analytics不能跟踪IE的事件。这是因为我的注入代码在IE中不存在。


尝试在 document.ready 之后,在连接 .click() 之前添加100ms超时。 - Diodeus - James MacFarlane
如果链接离开页面,无法获取统计数据可能是由于竞态条件引起的。 - epascarello
我考虑过这个问题,但我想如果我将alert()添加到onclick事件中,我就不必尝试这种延迟hack了。如果我在链接的onclick事件中有一个alert(),那么alert()应该会触发,而不需要放置延迟。但是...我已经试图解决这个问题很长时间了,所以我会尝试一下。 - user1132517
我认为“没有获取任何统计数据”这部分是一个好想法,但是有误导性。我的alert()甚至没有弹出来。所以我不认为jQuery的att函数将我的代码放在IE中的链接上。至少我应该看到一个带有数字1的警报框。 - user1132517
我添加了setTimeout,但没有起作用。 - user1132517
еҰӮжһңдҪ з”Ё.prop()д»Јжӣҝ.attr()дјҡеҸ‘з”ҹд»Җд№Ҳпјҹ - Sparky
5个回答

4
你不应该添加“onclick”属性,而是应该使用jQuery .click()事件。
function(index){
    var description = "Content ID: " + getParameterNamedID($(this).attr("href")) + " - " + $(this).children().first().attr("alt");
    $(this).click(function() {
        alert('1');
        _gaq.push(['_trackEvent', 'Favorites - Home Page', 'Icon Click',  _gatCleanString(description)]);
        alert('2');
    });
}

类似于上面的东西,抱歉我写得很快,可能有错别字。

除了我自己的一个打字错误之外,我不知道它为什么不能工作。一些参考资料:http://www.wduffy.co.uk/blog/tracking-google-goals-with-no-url-using-jquery/ - Jakub
Adam是正确的,我不能这样做,因为它会破坏分析。当我直接在链接上放置他们的跟踪事件函数时,我可以得到统计数据。但是当我将相同的跟踪事件函数放在$("a").click()中时,我无法得到统计数据。 - user1132517
谢谢提供链接,但正如我所提到的,我无法像$().click()或$().blur()这样在绑定中添加跟踪事件函数。在我的初始测试中,页面上除了两个链接外没有其他内容,一个链接使用$().click()绑定了跟踪事件,另一个链接在onlclick属性中内联了跟踪事件。绑定的那个没有在Google Analytics中被跟踪,而内联的那个却被跟踪了。我不知道为什么...只是它就是这样。 - user1132517

0

机会很小,但如果您的页面上有任何VBScript,则应在您的onclick字符串前加上“javascript:”


没有VBScript,但是这个添加前缀的想法还是值得一试的。我也会试试这个。 - user1132517
我添加了JavaScript:但没有帮助。 - user1132517

0

你可以使用历史悠久的DOM0 onclick 属性,尽管没有什么合理的理由说明为什么jQuery的click()方法不起作用。

$("._gatHomePageFavorites").each
    (
        function(index)
        {
            var $this = $(this);
            var description = "Content ID: "
                + getParameterNamedID($this.attr("href")) + " - "
                + $this.children().first().attr("alt");

            this.onclick = function() {
                alert('1');
                _gaq.push(['_trackEvent', 'Favorites - Home Page', 'Icon Click',
                    _gatCleanString(description)]);
                alert('2');
            };
        }
    );

jQuery的attr()方法通常不是很有用,但这是完全不同的抱怨。


我经常对attr()进行抱怨。我总是使用jQuery的click()。但是除非它内联在链接的onclick属性上,否则我无法使Google Analytics事件函数注册。你关于this.onclick的建议是有效的。这是一个难以测试的问题。我必须实施它,然后等待并查看是否在GA中获得统计数据。 - user1132517

0
要注意跟踪链接的一件事是,如果浏览器在获取跟踪像素之前离开页面,事件可能不会被记录,这取决于浏览器、计算机和网络速度。我在以下代码中运气不错(修改自@Tim Down的代码):
$("._gatHomePageFavorites").each
    (
        function(index)
        {
            var $this = $(this);
            var description = "Content ID: "
                + getParameterNamedID($this.attr("href")) + " - "
                + $this.children().first().attr("alt");
            $this.click(function(e) {
                alert('1');
                _gaq.push(['_trackEvent', 'Favorites - Home Page', 'Icon Click',
                    _gatCleanString(description)]);
                if ($this.attr('target') != '_blank') {
                    e.preventDefault();
                    setTimeout('document.location = "' + $this.attr('href') + '"', 150);
                }
            });
        }
    );

基本上,如果链接没有在新窗口中打开,请等待并自行跟随它。


0
事实证明,我的问题与Google Analytics或其跟踪事件无关。经过大量测试,我最终确定,在IE中,jQuery的$().attr()不起作用。
奇怪的是它没有崩溃或抛出错误。IE不知何故忽略了它,不会将我的动态JavaScript添加到锚标记的onclick参数中。
解决方案...
1. 显然的解决方法是像其他人建议的那样绑定事件。如果你可以使用$().click(),那么我同意,一定要使用它。永远不要使用$().attr("onclick","do something");
2. 然而,我的项目中的其他情况阻止我使用$().click()。除非事件跟踪功能内联在锚点标签上,否则我无法将统计数据输入到Google Analytics中的事件跟踪功能中。
回归老派...
$(".obj").each
        (
            function (index) {

                this.setAttribute("onclick", "alert('It is Working');");

            }
        );

感谢大家的帮助。


自从jQuery 1.6以来,在大多数情况下,.attr()可以/应该被替换为.prop()。http://api.jquery.com/prop/ - Sparky
这不适用于旧版IE(6和7),可能也包括兼容模式下的8甚至9。一般情况下,避免使用setAttribute(),尤其是对于事件处理程序来说。 - Tim Down

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接