jQuery - 我可以在它自己的处理程序中触发事件吗?

时间:2014-01-29 10:33:21

标签: javascript jquery html google-analytics

所以我基本上有一个.click事件,即e.preventDefault()。但是,一旦代码完成执行,我希望它在解除绑定后重新执行该事件。

所有这一切的背景是,我正在尝试使用谷歌分析(analytics.js)设置出站链接事件跟踪。

<a href="http://www.example.com/" id="link1"><img /></a>    
<script>        
    $("#link1").click(function(e) {
        e.preventDefault();

        ga('send', 'event', 
            'category', 
            'action', 
            'label', 
            { 
                'hitCallback': function() {                                         
                    $(this).unbind(e).trigger("click");
                } 
            }
        );
    });
</script>

此设置是必需的,否则页面会在事件发送之前终止。 此外,我想使代码片段尽可能独立,因为这个脚本将被复制粘贴到很多地方。

我希望有类似e.sleepDefault()的东西;和e.wakeDefault();

2 个答案:

答案 0 :(得分:2)

试试这个:

 $("#link1").click(function(e) {
    e.preventDefault();
    var url = $(this).prop('href');
    ga('send', 'event', 
        'category', 
        'action', 
        'label', 
        { 
            'hitCallback': function() {                                         
                window.location = url;
            } 
        }
    );
 });

答案 1 :(得分:1)

好的,经过大量的研究,我意识到我的问题特别是jQuery不允许你跟踪链接而不实际点击它们,因此你无法真正重新诅咒点击和希望它遵循链接。当你这样做时,它充当“模拟”点击,因此它实际上不会跟随href,但它将执行处理程序中的所有其他操作。

解决方案是使用javascript的原生click(),它不关心并会跟随链接。

所以这就是我的代码:

<a href="http://www.example.com/" id="link1"></a>    
<script>        
    $("#link1").click(function(e) {
        var obj = $(this);
        e.preventDefault();

        ga('send', 'event', 
            'category', 
            'action', 
            'label', 
            { 
                'hitCallback': function() {                                         
                    obj.off(e);
                    obj[0].click();
                } 
            }
        );
    });
</script>

所以这是细分:

  1. 处理程序在物理点击时执行,并启用了preventDefault()。
  2. 它将事件发送给Google。
  3. Google回复,并执行回调函数。
  4. 禁用点击处理程序以恢复默认行为。
  5. 再次模拟点击以执行默认处理程序。
  6. 关键是将{jQuery对象转换为htmlDomObject的[0],它允许您使用本机javascript click()而不是jQuery click(),就像我说的那样,不跟随LINKS。