/* @preserve dataset polyfill for IE < 11. See https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset and http://caniuse.com/#search=dataset @author ShirtlessKirk copyright 2015 @license WTFPL (http://www.wtfpl.net/txt/copying) */ const dash = /-([a-z])/gi; const dataRegEx = /^data-(.+)/; const hasEventListener = !!document.addEventListener; const test = document.createElement('_'); const DOMAttrModified = 'DOMAttrModified'; let mutationSupport = false; function clearDataset(event) { delete event.target._datasetCache; } function toCamelCase(string) { return string.replace(dash, function(_, letter) { return letter.toUpperCase(); }); } function getDataset() { const dataset = {}; for (let attribute of this.attributes) { let match = attribute.name.match(dataRegEx); if (match) { dataset[toCamelCase(match[1])] = attribute.value; } } return dataset; } function mutation() { if (hasEventListener) { test.removeEventListener(DOMAttrModified, mutation, false); } else { test.detachEvent(`on${DOMAttrModified}`, mutation); } mutationSupport = true; } if (!test.dataset) { if (hasEventListener) { test.addEventListener(DOMAttrModified, mutation, false); } else { test.attachEvent(`on${DOMAttrModified}`, mutation); } // trigger event (if supported) test.setAttribute('foo', 'bar'); Object.defineProperty(Element.prototype, 'dataset', { get: mutationSupport ? function get() { if (!this._datasetCache) { this._datasetCache = getDataset.call(this); } return this._datasetCache; } : getDataset }); if (mutationSupport && hasEventListener) { // < IE9 supports neither document.addEventListener(DOMAttrModified, clearDataset, false); } }