miguelzakharia/aurelia-google-analytics

grab clicks on svg elements

Opened this issue · 4 comments

Hi and thanks for this plugin!
I am successfully using this to track events on buttons and anchors.
I wish also to grab links on SVGElement with nodeName: image which do not trigger a pageview. Basically elements of a d3js based data visualization.
I'm using this code

.plugin('aurelia-google-analytics', config => {
      config.init('xxxxxx');
      config.attach({
        logging: {
          enabled: true, // Set to `true` to have some log messages appear in the browser console.
        },
        pageTracking: {
          enabled: true, // Set to `false` to disable in non-production environments.
          // Optional. By default it tracks clicks on anchors and buttons.
          filter: (element) => {
            return (element instanceof HTMLElement &&
              (element.nodeName.toLowerCase() === 'a' ||
                element.nodeName.toLowerCase() === 'button')) ||
              (element instanceof SVGElement && 
                (element.nodeName.toLowerCase() === 'image' ||
                element.nodeName.toLowerCase() === 'circle' ||
                element.nodeName.toLowerCase() === 'line'));
          },
        },
        clickTracking: {
          enabled: true, // Set to `false` to disable in non-production environments.
        },
      });
    });

I added the proper analytics attributes with

nodes.selectAll('.node__image')
        .attr('xlink:href', d => d.media)
        .attr('data-analytics-category', THAT.id)
        .attr('data-analytics-action', 'node')
        .attr('data-analytics-label', d => d.id)
        .on('click', nodeClick)

I also tried the same with svg:line and svg:circle elements.
But I can't manage to generate any of those events yet.

Sure, thanks.
This is a simplified version of a one-node visualization. Node is a group containing circle, text and image with mask.

<svg id="EcosystemSvg" width="804" height="733">
    <rect opacity="0" height="733" width="804"></rect>
    <g id="main-group" width="804" height="733">
        <g id="graph-group" transform="translate(-509.2254622382578,-451.4287720825889) scale(2.24388696106097)">
            <g class="links-group"></g>
            <g class="nodes-group">
                <g id="node_1" transform="translate(402, 366)">
                    <circle class="node__circle" id="node_1_circle" r="31" style="fill: url(#radial-gradient_4);"></circle>
                    <defs>
                        <clipPath id="node_1_clip" class="node-clip" r="31">
                            <circle r="31"></circle>
                        </clipPath>
                    </defs>
                    <text id="node_1_label" class="node-label" text-anchor="middle" dy="0" clip-path="url(#node_1_clip)" fill="#4f4c4d" y="0.6em" style="font-size: 7.83394px;">
                        <tspan x="0" dy="0em">Node title </tspan>
                    </text>
                    <image id="node_1_image" class="node__image" preserveAspectRatio="xMidYMid slice" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="media/20171122_122050_daffodil-2-wallpaper-3840x2160_sm.jpg" clip-path="url(#node_1_clip)" data-analytics-category="graph" data-analytics-action="bubble" data-analytics-label="node_1" width="68" height="68" x="-34" y="-34"></image>
                </g>
            </g>
        </g>
    </g>
</svg>

Ok, I think I know what the problem is. The criteria object needs to be expanded to include an isSvgElement property and hasTrackingInfo needs to be modified to take into consideration an SVG. Once that is complete, you will be able to override the filter property in clickTracking to include svg in addition to a and button.

I probably will not have a chance to complete the changes tonight, but I should have something by the end of this week.

A few days turned into several months 😞

I have the code written (branch issue-28) and preliminary tests look good. I ran into problems linking the plugin and I'm still working those out.