@gleaner/tracker
Version:
A JavaScript tracking library with ecommerce support
90 lines (79 loc) • 1.69 kB
JavaScript
// DOM Events IE8+ Support
const on = function (el, type, callback) {
if (el.addEventListener) {
el.addEventListener(type, callback);
} else {
el.attachEvent('on' + type, function() {
callback.call(el);
});
}
}
const off = function (el, type, callback) {
if (el.removeEventListener) {
el.removeEventListener(type, callback);
} else {
el.detachEvent('on' + type, callback);
}
}
/*
'Unwraps' array to object by key. Similar to _.keyBy
@param {Array}
@param {String}
@returns {Object}
*/
const keyBy = function(arr, key) {
let result = {};
for (let i in arr) {
let item = arr[i];
result[item[key]] = item;
}
return result;
}
/*
@param {Object}
@param {String}
@returns {Object}
*/
const mapValues = function(obj, prop) {
let result = {};
for (let key in obj) {
result[key] = obj[key][prop];
}
// Object.keys(obj).map((key) => {
// result[key] = obj[key][prop];
// });
return result;
}
/*
@returns {Boolean} flag for localStorage support
*/
function hasLocalStorage() {
const test = '__gleaner-test__'; // random string would be better
try {
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch(e) {
return false;
}
}
/*
Creates function for capturing track commands in a queue
@param {Object} context e.g. window
@returns {Function}
*/
function createInstance(ctx = {}) {
let instance = ctx[name] = ctx[name] || function() {
ctx[name].queue.push(arguments); // log all calls in a queue
}
instance.queue = instance.queue || []; // queue alredy empty before calling the function...
return instance;
}
export {
on,
off,
keyBy,
mapValues,
hasLocalStorage,
createInstance,
}