【问题标题】:Resume original anchor click event after Google Analytics call谷歌分析调用后恢复原始锚点点击事件
【发布时间】:2014-07-18 20:40:12
【问题描述】:

对于我们网站上的一堆锚标签,我们会向 Google Analytics 发送一个事件以跟踪用户行为,现在我正在使用以下代码(点击触发):

event.preventDefault();
ga(tracker, 'event', category, action, label, value, { 'hitCallback':
    function(){
        window.location = url;
    }
}); 

这工作正常,但有一个问题,一些用户(包括我自己)倾向于使用鼠标中键/命令+单击大多数链接,以便在新选项卡中打开它们。这显然不适用于上述脚本。

我想知道是否有类似event.triggerDefault() 的东西会将事件的控制权交还给浏览器,或者我是否真的必须构建一些东西来检测来自用户的中间鼠标/命令点击。

旁注:我们使用原生 javascript

【问题讨论】:

  • 嗨,对不起,没有时间写出我的想法,但您可以跟踪中间按钮点击查看:stackoverflow.com/questions/1795734/… 并认为您可以添加一个 if 语句来确定他们使用的鼠标按钮点击。
  • 很遗憾,这不起作用,因为为了检测命令+点击,我必须在 keydown / keyupping 命令按钮或其他东西时设置全局变量,并且会在不同的操作系统之间提供问题。
  • 所以事实证明你不必设置全局变量,因为事件包含告诉你这个的属性(event.metaKey)。但这仍然意味着用 Javascript 重写浏览器功能,这是非常糟糕的做法,并且很有可能会在浏览器更新时中断。

标签: javascript google-analytics anchor event-tracking


【解决方案1】:

How to trigger an event after using event.preventDefault()How to clone or re-dispatch DOM events? 的帮助下,我想出了以下解决方案:

<script>
var anchor = document.getElementById('anchor');
anchor.addEventListener('click', function(e){
    if(e.eventHandled) return;
    e.preventDefault();

    window.alert('Javascripts');

    var clonedEvent = new e.constructor(e.type, e);
    clonedEvent.initEvent(e.type, true, false);
    clonedEvent.eventHandled = true;
    anchor.dispatchEvent(clonedEvent);
});
</script>
<a href="http://www.google.com/" id="anchor">Google</a>

现在,当命令+单击链接时,您首先会收到警报,然后会发送到新选项卡。

Jsfiddle:http://jsfiddle.net/8NRJY/1/(请注意,如果您进行正常点击,jsfiddle 不会更改 url,但这在 jsfiddle 之外可以正常工作)

现在剩下的就是让这个跨浏览器兼容,当然还要插入谷歌跟踪(dispatchEvent 将在回调中)。

编辑:这是跨浏览器(至少 IE8+)兼容的版本。

如果您使用本机 javascript,第一个函数应该是库的一部分。

<script>
var addEventListener = function(elem, eventName, handler, useCapture) {
    if (elem!=null) {
        if (elem.addEventListener) {
            if (useCapture===true||useCapture===false) {
                elem.addEventListener(eventName, handler, useCapture);
            }
            else {
                elem.addEventListener(eventName, handler);
            }
        } else {
            elem.attachEvent('on' + eventName, function(evt) {              
                evt = evt || window.event;
                evt.target = evt.target || evt.srcElement;
                handler(evt);
            });
        }
    }
};

var onReady = function (fn) {
    if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', fn);
    } else {
        document.attachEvent('onreadystatechange', function() {
            if (document.readyState === 'interactive' || document.readyState === 'complete'){
                fn();
            }
        });
    }
};

var fireEvent = function(el, event){
    if(document.createEvent){
        var clonedEvent = new event.constructor(event.type, event);
        clonedEvent.initEvent(event.type, true, false);
        el.dispatchEvent(clonedEvent);
    }else if(document.createEventObject){
        var clonedEvent = document.createEventObject();
        el.fireEvent('on'+event.type, clonedEvent);
    }
};

onReady(function(){
    var anchor = document.getElementById('anchor');
    addEventListener(anchor, 'click', function(e){
        if(!anchor.eventDispatched){
            e.preventDefault ? e.preventDefault() : e.returnValue = false;
            anchor.eventDispatched = true;
            fireEvent(anchor, e);
        }else{
            anchor.eventDispatched = false;
            e.returnValue = true;
        }
    });
});
</script>
<a id="anchor" href="http://www.google.com">Test</a>  

编辑 2: 解决此问题以使用 Google Analytics(分析)被证明是一项比我想象的要困难得多的任务。

在现代浏览器中,它可以立即运行。在 IE8 中,一次只有一个事件(存储在 window.event),这意味着 Google 的回调会覆盖它,这意味着我无法重新触发原始事件。我正在尝试各种克隆事件的方法以使其正常工作,但到目前为止还没有成功。

我讨厌你 IE8。

编辑 3:我已经放弃尝试在 IE8 中进行这项工作。

编辑 4:事实证明,Chrome 将新窗口阻止为弹出窗口,因为该事件是在回调之后触发的(即使它是原始用户点击事件)。

【讨论】:

    【解决方案2】:

    如果您想使用 Google 分析跟踪您网站上内部链接的用户导航,以下可能会有所帮助。

    1. 将 Google Analytics (GA) 事件数据存储在 Cookie 中,但暂时不要发送 GA 事件。
    2. 让 DOM 事件的默认行为执行。
    3. 在下一页上,读取 cookie,查找排队的 GA 事件,并将它们发送到分析。

    根据我的经验,cookie 是在离开页面前立即设置的。

    为确保 GA 事件与您报告中的正确页面相对应,您应该执行以下操作将事件发送给 GA:

    var currentPage = window.location.pathname;
    var previousPage = document.referrer.replace(/^[^:]+:\/\/[^/]+/, '').replace(/#.*/, '');
    
    ga('set', 'page', previousPage);
    ga(tracker, 'event', category, action, label, value, { 
        'hitCallback': function(){
            ga('set', 'page', currentPage);
        },
        'nonInteraction': 1
    });
    

    回调为后续分析请求恢复页面值。非交互可确保事件不会影响您的跳出率。

    【讨论】:

    • 所以我尝试了这个,但是当一个接一个地快速打开几个选项卡时(可能的情况),您会在读取/设置保存事件队列的 cookie 时遇到竞争条件。这意味着很多时候事件将被多次发送。
    • 好点。您可以添加一个服务器端调用来检查竞争条件,但这可能不是您想要做的事情。
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2012-05-17
    • 2016-06-02
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多