mixpanel tracker
by John Allan
HTML
<script src="https://www.resaas.com/assets/common/js/vendor/q/q.js"></script>
<div id="html" data-mixpanel-guid="123456" data-mixpanel-content_subtype="buyer need">
<a href="#" class="btn2" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Ajax</a>
<br>
<a id="testLink" href="/some/link" class="btn2" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Link</a>
<br>
<a id="testLink" href="http://www.google.com" class="btn2" target="_blank" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Open New Window</a>
<br>
<a href="#">Nothing</a>
</div>
JavaScript
var globalData;
function trackEvent(name, data, url) {
console.log('trackEvent(', name, ', ', JSON.stringify(data), ', ', url, ');');
};
function trackEventPromise(name, data) {
var d = Q.defer();
mixpanel.track(name, data, function () {
d.resolve('mixpanel request complete');
});
setTimeout(function () {
d.reject(new Error("mixpanel request timed out"));
}, 1000);
return d.promise;
};
function isLink(href) {
if (
typeof href === 'string'
&& href !== ''
&& href !== '#'
&& href.indexOf('javascript:') !== 0
) {
return true;
}
return false;
};
function getMixpanelData (element) {
var mpObj, attrs, attrPrefix, attrPrefixLength, i, l;
attrPrefix = 'data-mixpanel-';
attrPrefixLength = attrPrefix.length;
if (typeof element === 'undefined' || typeof element === null) {
return false;
}
if (typeof element === 'string') {
element = document.querySelector(element);
}
mpObj = false;
attrs = element.attributes;
//look at all element attributes
for(i = 0, l = attrs.length; i < l; i++) {
//if element attribute matches data-mixpanel add to the mixpanel object
if (attrs[i].name.indexOf(attrPrefix) === 0) {
if (!mpObj) { mpObj = {}; }
mpObj[attrs[i].name.substr(attrPrefixLength)] = attrs[i].value
}
}
return mpObj;
};
globalData = getMixpanelData('#html');
document.querySelector('#testLink').addEventListener('click', function () {
console.log('other event binding');
});
document.querySelector('#html').addEventListener('click', function (e) {
var mpObj, href, target, redirect, i, l;
mpObj = {};
href = false;
//get mixpanel data
mpObj = getMixpanelData(e.target);
//not mixpanel, exit
if (!mpObj['name']) {
return;
}
//capture the href if it is a link
if (isLink(e.target.getAttribute('href'))) {
href = e.target.getAttribute('href');
target = e.target.getAttribute('target');
}
//if href is set and not opening a new...