diff --git a/dist/maps/what-input.min.js.map b/dist/maps/what-input.min.js.map index af71b17..c28ffc7 100644 --- a/dist/maps/what-input.min.js.map +++ b/dist/maps/what-input.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["what-input.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","m","modules","document","window","ask","element","ignoreKeys","specificKeys","registerOnChange","unRegisterOnChange","docElem","documentElement","currentElement","currentInput","currentIntent","currentTimestamp","Date","now","getAttribute","body","sessionStorage","getItem","e","formInputs","functionList","ignoreMap","specificMap","inputMap","keydown","keyup","mousedown","mousemove","MSPointerDown","MSPointerMove","pointerdown","pointermove","touchstart","touchend","isScrolling","mousePos","x","y","pointerMap","2","3","4","supportsPassive","opts","Object","defineProperty","get","addEventListener","addListeners","options","passive","PointerEvent","setInput","setIntent","MSPointerEvent","detectWheel","setElement","clearElement","event","eventKey","which","value","type","pointerType","ignoreMatch","length","indexOf","specificMatch","shouldUpdate","validateTouch","persistInput","doUpdate","activeElem","activeElement","nodeName","toLowerCase","checkClosest","setAttribute","fireFunctions","detectScrolling","target","classList","toString","replace","removeAttribute","setItem","timestamp","touchIsValid","createElement","undefined","onmousewheel","i","len","fn","call","screenX","screenY","elem","tag","ElementPrototype","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","parentElement","parentNode","nodeType","Array","opt","arr","eventType","push","position","match","objPos","splice","clearStorage","clear","c","p","moduleId","id","loaded"],"mappings":"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","file":"../what-input.min.js","sourcesContent":["/**\n * what-input - A global utility for tracking the current input method (mouse, keyboard or touch).\n * @version v5.2.5\n * @link https://github.com/ten1seven/what-input\n * @license MIT\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"whatInput\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"whatInput\"] = factory();\n\telse\n\t\troot[\"whatInput\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t /*\n\t * bail out if there is no document or window\n\t * (i.e. in a node/non-DOM environment)\n\t *\n\t * Return a stubbed API instead\n\t */\n\t if (typeof document === 'undefined' || typeof window === 'undefined') {\n\t return {\n\t // always return \"initial\" because no interaction will ever be detected\n\t ask: function ask() {\n\t return 'initial';\n\t },\n\n\t // always return null\n\t element: function element() {\n\t return null;\n\t },\n\n\t // no-op\n\t ignoreKeys: function ignoreKeys() {},\n\n\t // no-op\n\t specificKeys: function specificKeys() {},\n\n\t // no-op\n\t registerOnChange: function registerOnChange() {},\n\n\t // no-op\n\t unRegisterOnChange: function unRegisterOnChange() {}\n\t };\n\t }\n\n\t /*\n\t * variables\n\t */\n\n\t // cache document.documentElement\n\t var docElem = document.documentElement;\n\n\t // currently focused dom element\n\t var currentElement = null;\n\n\t // last used input type\n\t var currentInput = 'initial';\n\n\t // last used input intent\n\t var currentIntent = currentInput;\n\n\t // UNIX timestamp of current event\n\t var currentTimestamp = Date.now();\n\n\t // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true`\n\t var shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false');\n\n\t if (shouldPersist) {\n\t // check for session variables and use if available\n\t try {\n\t if (window.sessionStorage.getItem('what-input')) {\n\t currentInput = window.sessionStorage.getItem('what-input');\n\t }\n\n\t if (window.sessionStorage.getItem('what-intent')) {\n\t currentIntent = window.sessionStorage.getItem('what-intent');\n\t }\n\t } catch (e) {\n\t // fail silently\n\t }\n\t }\n\n\t // form input types\n\t var formInputs = ['button', 'input', 'select', 'textarea'];\n\n\t // empty array for holding callback functions\n\t var functionList = [];\n\n\t // list of modifier keys commonly used with the mouse and\n\t // can be safely ignored to prevent false keyboard detection\n\t var ignoreMap = [16, // shift\n\t 17, // control\n\t 18, // alt\n\t 91, // Windows key / left Apple cmd\n\t 93 // Windows menu / right Apple cmd\n\t ];\n\n\t var specificMap = [];\n\n\t // mapping of events to input types\n\t var inputMap = {\n\t keydown: 'keyboard',\n\t keyup: 'keyboard',\n\t mousedown: 'mouse',\n\t mousemove: 'mouse',\n\t MSPointerDown: 'pointer',\n\t MSPointerMove: 'pointer',\n\t pointerdown: 'pointer',\n\t pointermove: 'pointer',\n\t touchstart: 'touch',\n\t touchend: 'touch'\n\n\t // boolean: true if the page is being scrolled\n\t };var isScrolling = false;\n\n\t // store current mouse position\n\t var mousePos = {\n\t x: null,\n\t y: null\n\n\t // map of IE 10 pointer events\n\t };var pointerMap = {\n\t 2: 'touch',\n\t 3: 'touch', // treat pen like touch\n\t 4: 'mouse'\n\n\t // check support for passive event listeners\n\t };var supportsPassive = false;\n\n\t try {\n\t var opts = Object.defineProperty({}, 'passive', {\n\t get: function get() {\n\t supportsPassive = true;\n\t }\n\t });\n\n\t window.addEventListener('test', null, opts);\n\t } catch (e) {}\n\t // fail silently\n\n\n\t /*\n\t * set up\n\t */\n\n\t var setUp = function setUp() {\n\t // add correct mouse wheel event mapping to `inputMap`\n\t inputMap[detectWheel()] = 'mouse';\n\n\t addListeners();\n\t doUpdate('input');\n\t doUpdate('intent');\n\t };\n\n\t /*\n\t * events\n\t */\n\n\t var addListeners = function addListeners() {\n\t // `pointermove`, `MSPointerMove`, `mousemove` and mouse wheel event binding\n\t // can only demonstrate potential, but not actual, interaction\n\t // and are treated separately\n\t var options = supportsPassive ? { passive: true } : false;\n\n\t // pointer events (mouse, pen, touch)\n\t if (window.PointerEvent) {\n\t window.addEventListener('pointerdown', setInput);\n\t window.addEventListener('pointermove', setIntent);\n\t } else if (window.MSPointerEvent) {\n\t window.addEventListener('MSPointerDown', setInput);\n\t window.addEventListener('MSPointerMove', setIntent);\n\t } else {\n\t // mouse events\n\t window.addEventListener('mousedown', setInput);\n\t window.addEventListener('mousemove', setIntent);\n\n\t // touch events\n\t if ('ontouchstart' in window) {\n\t window.addEventListener('touchstart', setInput, options);\n\t window.addEventListener('touchend', setInput);\n\t }\n\t }\n\n\t // mouse wheel\n\t window.addEventListener(detectWheel(), setIntent, options);\n\n\t // keyboard events\n\t window.addEventListener('keydown', setInput);\n\t window.addEventListener('keyup', setInput);\n\n\t // focus events\n\t window.addEventListener('focusin', setElement);\n\t window.addEventListener('focusout', clearElement);\n\t };\n\n\t // checks conditions before updating new input\n\t var setInput = function setInput(event) {\n\t var eventKey = event.which;\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t var ignoreMatch = !specificMap.length && ignoreMap.indexOf(eventKey) === -1;\n\n\t var specificMatch = specificMap.length && specificMap.indexOf(eventKey) !== -1;\n\n\t var shouldUpdate = value === 'keyboard' && eventKey && (ignoreMatch || specificMatch) || value === 'mouse' || value === 'touch';\n\n\t // prevent touch detection from being overridden by event execution order\n\t if (validateTouch(value)) {\n\t shouldUpdate = false;\n\t }\n\n\t if (shouldUpdate && currentInput !== value) {\n\t currentInput = value;\n\n\t persistInput('input', currentInput);\n\t doUpdate('input');\n\t }\n\n\t if (shouldUpdate && currentIntent !== value) {\n\t // preserve intent for keyboard interaction with form fields\n\t var activeElem = document.activeElement;\n\t var notFormInput = activeElem && activeElem.nodeName && (formInputs.indexOf(activeElem.nodeName.toLowerCase()) === -1 || activeElem.nodeName.toLowerCase() === 'button' && !checkClosest(activeElem, 'form'));\n\n\t if (notFormInput) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t }\n\t };\n\n\t // updates the doc and `inputTypes` array with new input\n\t var doUpdate = function doUpdate(which) {\n\t docElem.setAttribute('data-what' + which, which === 'input' ? currentInput : currentIntent);\n\n\t fireFunctions(which);\n\t };\n\n\t // updates input intent for `mousemove` and `pointermove`\n\t var setIntent = function setIntent(event) {\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t // test to see if `mousemove` happened relative to the screen to detect scrolling versus mousemove\n\t detectScrolling(event);\n\n\t // only execute if scrolling isn't happening\n\t if ((!isScrolling && !validateTouch(value) || isScrolling && event.type === 'wheel' || event.type === 'mousewheel' || event.type === 'DOMMouseScroll') && currentIntent !== value) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t };\n\n\t var setElement = function setElement(event) {\n\t if (!event.target.nodeName) {\n\t // If nodeName is undefined, clear the element\n\t // This can happen if click inside an element.\n\t clearElement();\n\t return;\n\t }\n\n\t currentElement = event.target.nodeName.toLowerCase();\n\t docElem.setAttribute('data-whatelement', currentElement);\n\n\t if (event.target.classList && event.target.classList.length) {\n\t docElem.setAttribute('data-whatclasses', event.target.classList.toString().replace(' ', ','));\n\t }\n\t };\n\n\t var clearElement = function clearElement() {\n\t currentElement = null;\n\n\t docElem.removeAttribute('data-whatelement');\n\t docElem.removeAttribute('data-whatclasses');\n\t };\n\n\t var persistInput = function persistInput(which, value) {\n\t try {\n\t window.sessionStorage.setItem('what-' + which, value);\n\t } catch (e) {\n\t // fail silently\n\t }\n\t };\n\n\t /*\n\t * utilities\n\t */\n\n\t var pointerType = function pointerType(event) {\n\t if (typeof event.pointerType === 'number') {\n\t return pointerMap[event.pointerType];\n\t } else {\n\t // treat pen like touch\n\t return event.pointerType === 'pen' ? 'touch' : event.pointerType;\n\t }\n\t };\n\n\t // prevent touch detection from being overridden by event execution order\n\t var validateTouch = function validateTouch(value) {\n\t var timestamp = Date.now();\n\n\t var touchIsValid = value === 'mouse' && currentInput === 'touch' && timestamp - currentTimestamp < 200;\n\n\t currentTimestamp = timestamp;\n\n\t return touchIsValid;\n\t };\n\n\t // detect version of mouse wheel event to use\n\t // via https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event\n\t var detectWheel = function detectWheel() {\n\t var wheelType = null;\n\n\t // Modern browsers support \"wheel\"\n\t if ('onwheel' in document.createElement('div')) {\n\t wheelType = 'wheel';\n\t } else {\n\t // Webkit and IE support at least \"mousewheel\"\n\t // or assume that remaining browsers are older Firefox\n\t wheelType = document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll';\n\t }\n\n\t return wheelType;\n\t };\n\n\t // runs callback functions\n\t var fireFunctions = function fireFunctions(type) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].type === type) {\n\t functionList[i].fn.call(undefined, type === 'input' ? currentInput : currentIntent);\n\t }\n\t }\n\t };\n\n\t // finds matching element in an object\n\t var objPos = function objPos(match) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].fn === match) {\n\t return i;\n\t }\n\t }\n\t };\n\n\t var detectScrolling = function detectScrolling(event) {\n\t if (mousePos.x !== event.screenX || mousePos.y !== event.screenY) {\n\t isScrolling = false;\n\n\t mousePos.x = event.screenX;\n\t mousePos.y = event.screenY;\n\t } else {\n\t isScrolling = true;\n\t }\n\t };\n\n\t // manual version of `closest()`\n\t var checkClosest = function checkClosest(elem, tag) {\n\t var ElementPrototype = window.Element.prototype;\n\n\t if (!ElementPrototype.matches) {\n\t ElementPrototype.matches = ElementPrototype.msMatchesSelector || ElementPrototype.webkitMatchesSelector;\n\t }\n\n\t if (!ElementPrototype.closest) {\n\t do {\n\t if (elem.matches(tag)) {\n\t return elem;\n\t }\n\n\t elem = elem.parentElement || elem.parentNode;\n\t } while (elem !== null && elem.nodeType === 1);\n\n\t return null;\n\t } else {\n\t return elem.closest(tag);\n\t }\n\t };\n\n\t /*\n\t * init\n\t */\n\n\t // don't start script unless browser cuts the mustard\n\t // (also passes if polyfills are used)\n\t if ('addEventListener' in window && Array.prototype.indexOf) {\n\t setUp();\n\t }\n\n\t /*\n\t * api\n\t */\n\n\t return {\n\t // returns string: the current input type\n\t // opt: 'intent'|'input'\n\t // 'input' (default): returns the same value as the `data-whatinput` attribute\n\t // 'intent': includes `data-whatintent` value if it's different than `data-whatinput`\n\t ask: function ask(opt) {\n\t return opt === 'intent' ? currentIntent : currentInput;\n\t },\n\n\t // returns string: the currently focused element or null\n\t element: function element() {\n\t return currentElement;\n\t },\n\n\t // overwrites ignored keys with provided array\n\t ignoreKeys: function ignoreKeys(arr) {\n\t ignoreMap = arr;\n\t },\n\n\t // overwrites specific char keys to update on\n\t specificKeys: function specificKeys(arr) {\n\t specificMap = arr;\n\t },\n\n\t // attach functions to input and intent \"events\"\n\t // funct: function to fire on change\n\t // eventType: 'input'|'intent'\n\t registerOnChange: function registerOnChange(fn, eventType) {\n\t functionList.push({\n\t fn: fn,\n\t type: eventType || 'input'\n\t });\n\t },\n\n\t unRegisterOnChange: function unRegisterOnChange(fn) {\n\t var position = objPos(fn);\n\n\t if (position || position === 0) {\n\t functionList.splice(position, 1);\n\t }\n\t },\n\n\t clearStorage: function clearStorage() {\n\t window.sessionStorage.clear();\n\t }\n\t };\n\t}();\n\n/***/ })\n/******/ ])\n});\n;"]} \ No newline at end of file +{"version":3,"sources":["what-input.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","m","modules","document","window","ask","element","ignoreKeys","specificKeys","registerOnChange","unRegisterOnChange","docElem","documentElement","currentElement","currentInput","currentIntent","currentTimestamp","Date","now","shouldPersist","formInputs","functionList","ignoreMap","specificMap","inputMap","keydown","keyup","mousedown","mousemove","MSPointerDown","MSPointerMove","pointerdown","pointermove","touchstart","touchend","isScrolling","mousePos","x","y","pointerMap","2","3","4","supportsPassive","opts","Object","defineProperty","get","addEventListener","e","addListeners","options","passive","setPersist","PointerEvent","setInput","setIntent","MSPointerEvent","detectWheel","setElement","clearElement","getAttribute","body","sessionStorage","getItem","doUpdate","event","eventKey","which","value","type","pointerType","ignoreMatch","length","indexOf","specificMatch","shouldUpdate","validateTouch","persistInput","activeElem","activeElement","nodeName","toLowerCase","checkClosest","setAttribute","fireFunctions","detectScrolling","target","classList","toString","replace","removeAttribute","setItem","timestamp","touchIsValid","createElement","undefined","onmousewheel","i","len","fn","call","screenX","screenY","elem","tag","ElementPrototype","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","parentElement","parentNode","nodeType","Array","opt","arr","eventType","push","position","match","objPos","splice","clearStorage","clear","c","p","moduleId","id","loaded"],"mappings":"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","file":"../what-input.min.js","sourcesContent":["/**\n * what-input - A global utility for tracking the current input method (mouse, keyboard or touch).\n * @version v5.2.6\n * @link https://github.com/ten1seven/what-input\n * @license MIT\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"whatInput\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"whatInput\"] = factory();\n\telse\n\t\troot[\"whatInput\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t /*\n\t * bail out if there is no document or window\n\t * (i.e. in a node/non-DOM environment)\n\t *\n\t * Return a stubbed API instead\n\t */\n\t if (typeof document === 'undefined' || typeof window === 'undefined') {\n\t return {\n\t // always return \"initial\" because no interaction will ever be detected\n\t ask: function ask() {\n\t return 'initial';\n\t },\n\n\t // always return null\n\t element: function element() {\n\t return null;\n\t },\n\n\t // no-op\n\t ignoreKeys: function ignoreKeys() {},\n\n\t // no-op\n\t specificKeys: function specificKeys() {},\n\n\t // no-op\n\t registerOnChange: function registerOnChange() {},\n\n\t // no-op\n\t unRegisterOnChange: function unRegisterOnChange() {}\n\t };\n\t }\n\n\t /*\n\t * variables\n\t */\n\n\t // cache document.documentElement\n\t var docElem = document.documentElement;\n\n\t // currently focused dom element\n\t var currentElement = null;\n\n\t // last used input type\n\t var currentInput = 'initial';\n\n\t // last used input intent\n\t var currentIntent = currentInput;\n\n\t // UNIX timestamp of current event\n\t var currentTimestamp = Date.now();\n\n\t // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true`\n\t var shouldPersist = 'false';\n\n\t // form input types\n\t var formInputs = ['button', 'input', 'select', 'textarea'];\n\n\t // empty array for holding callback functions\n\t var functionList = [];\n\n\t // list of modifier keys commonly used with the mouse and\n\t // can be safely ignored to prevent false keyboard detection\n\t var ignoreMap = [16, // shift\n\t 17, // control\n\t 18, // alt\n\t 91, // Windows key / left Apple cmd\n\t 93 // Windows menu / right Apple cmd\n\t ];\n\n\t var specificMap = [];\n\n\t // mapping of events to input types\n\t var inputMap = {\n\t keydown: 'keyboard',\n\t keyup: 'keyboard',\n\t mousedown: 'mouse',\n\t mousemove: 'mouse',\n\t MSPointerDown: 'pointer',\n\t MSPointerMove: 'pointer',\n\t pointerdown: 'pointer',\n\t pointermove: 'pointer',\n\t touchstart: 'touch',\n\t touchend: 'touch'\n\n\t // boolean: true if the page is being scrolled\n\t };var isScrolling = false;\n\n\t // store current mouse position\n\t var mousePos = {\n\t x: null,\n\t y: null\n\n\t // map of IE 10 pointer events\n\t };var pointerMap = {\n\t 2: 'touch',\n\t 3: 'touch', // treat pen like touch\n\t 4: 'mouse'\n\n\t // check support for passive event listeners\n\t };var supportsPassive = false;\n\n\t try {\n\t var opts = Object.defineProperty({}, 'passive', {\n\t get: function get() {\n\t supportsPassive = true;\n\t }\n\t });\n\n\t window.addEventListener('test', null, opts);\n\t } catch (e) {}\n\t // fail silently\n\n\n\t /*\n\t * set up\n\t */\n\n\t var setUp = function setUp() {\n\t // add correct mouse wheel event mapping to `inputMap`\n\t inputMap[detectWheel()] = 'mouse';\n\n\t addListeners();\n\t };\n\n\t /*\n\t * events\n\t */\n\n\t var addListeners = function addListeners() {\n\t // `pointermove`, `MSPointerMove`, `mousemove` and mouse wheel event binding\n\t // can only demonstrate potential, but not actual, interaction\n\t // and are treated separately\n\t var options = supportsPassive ? { passive: true } : false;\n\n\t document.addEventListener('DOMContentLoaded', setPersist);\n\n\t // pointer events (mouse, pen, touch)\n\t if (window.PointerEvent) {\n\t window.addEventListener('pointerdown', setInput);\n\t window.addEventListener('pointermove', setIntent);\n\t } else if (window.MSPointerEvent) {\n\t window.addEventListener('MSPointerDown', setInput);\n\t window.addEventListener('MSPointerMove', setIntent);\n\t } else {\n\t // mouse events\n\t window.addEventListener('mousedown', setInput);\n\t window.addEventListener('mousemove', setIntent);\n\n\t // touch events\n\t if ('ontouchstart' in window) {\n\t window.addEventListener('touchstart', setInput, options);\n\t window.addEventListener('touchend', setInput);\n\t }\n\t }\n\n\t // mouse wheel\n\t window.addEventListener(detectWheel(), setIntent, options);\n\n\t // keyboard events\n\t window.addEventListener('keydown', setInput);\n\t window.addEventListener('keyup', setInput);\n\n\t // focus events\n\t window.addEventListener('focusin', setElement);\n\t window.addEventListener('focusout', clearElement);\n\t };\n\n\t // checks if input persistence should happen and\n\t // get saved state from session storage if true (defaults to `false`)\n\t var setPersist = function setPersist() {\n\t shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false');\n\n\t if (shouldPersist) {\n\t // check for session variables and use if available\n\t try {\n\t if (window.sessionStorage.getItem('what-input')) {\n\t currentInput = window.sessionStorage.getItem('what-input');\n\t }\n\n\t if (window.sessionStorage.getItem('what-intent')) {\n\t currentIntent = window.sessionStorage.getItem('what-intent');\n\t }\n\t } catch (e) {\n\t // fail silently\n\t }\n\t }\n\n\t // always run these so at least `initial` state is set\n\t doUpdate('input');\n\t doUpdate('intent');\n\t };\n\n\t // checks conditions before updating new input\n\t var setInput = function setInput(event) {\n\t var eventKey = event.which;\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t var ignoreMatch = !specificMap.length && ignoreMap.indexOf(eventKey) === -1;\n\n\t var specificMatch = specificMap.length && specificMap.indexOf(eventKey) !== -1;\n\n\t var shouldUpdate = value === 'keyboard' && eventKey && (ignoreMatch || specificMatch) || value === 'mouse' || value === 'touch';\n\n\t // prevent touch detection from being overridden by event execution order\n\t if (validateTouch(value)) {\n\t shouldUpdate = false;\n\t }\n\n\t if (shouldUpdate && currentInput !== value) {\n\t currentInput = value;\n\n\t persistInput('input', currentInput);\n\t doUpdate('input');\n\t }\n\n\t if (shouldUpdate && currentIntent !== value) {\n\t // preserve intent for keyboard interaction with form fields\n\t var activeElem = document.activeElement;\n\t var notFormInput = activeElem && activeElem.nodeName && (formInputs.indexOf(activeElem.nodeName.toLowerCase()) === -1 || activeElem.nodeName.toLowerCase() === 'button' && !checkClosest(activeElem, 'form'));\n\n\t if (notFormInput) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t }\n\t };\n\n\t // updates the doc and `inputTypes` array with new input\n\t var doUpdate = function doUpdate(which) {\n\t docElem.setAttribute('data-what' + which, which === 'input' ? currentInput : currentIntent);\n\n\t fireFunctions(which);\n\t };\n\n\t // updates input intent for `mousemove` and `pointermove`\n\t var setIntent = function setIntent(event) {\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t // test to see if `mousemove` happened relative to the screen to detect scrolling versus mousemove\n\t detectScrolling(event);\n\n\t // only execute if scrolling isn't happening\n\t if ((!isScrolling && !validateTouch(value) || isScrolling && event.type === 'wheel' || event.type === 'mousewheel' || event.type === 'DOMMouseScroll') && currentIntent !== value) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t };\n\n\t var setElement = function setElement(event) {\n\t if (!event.target.nodeName) {\n\t // If nodeName is undefined, clear the element\n\t // This can happen if click inside an element.\n\t clearElement();\n\t return;\n\t }\n\n\t currentElement = event.target.nodeName.toLowerCase();\n\t docElem.setAttribute('data-whatelement', currentElement);\n\n\t if (event.target.classList && event.target.classList.length) {\n\t docElem.setAttribute('data-whatclasses', event.target.classList.toString().replace(' ', ','));\n\t }\n\t };\n\n\t var clearElement = function clearElement() {\n\t currentElement = null;\n\n\t docElem.removeAttribute('data-whatelement');\n\t docElem.removeAttribute('data-whatclasses');\n\t };\n\n\t var persistInput = function persistInput(which, value) {\n\t if (shouldPersist) {\n\t try {\n\t window.sessionStorage.setItem('what-' + which, value);\n\t } catch (e) {\n\t // fail silently\n\t }\n\t }\n\t };\n\n\t /*\n\t * utilities\n\t */\n\n\t var pointerType = function pointerType(event) {\n\t if (typeof event.pointerType === 'number') {\n\t return pointerMap[event.pointerType];\n\t } else {\n\t // treat pen like touch\n\t return event.pointerType === 'pen' ? 'touch' : event.pointerType;\n\t }\n\t };\n\n\t // prevent touch detection from being overridden by event execution order\n\t var validateTouch = function validateTouch(value) {\n\t var timestamp = Date.now();\n\n\t var touchIsValid = value === 'mouse' && currentInput === 'touch' && timestamp - currentTimestamp < 200;\n\n\t currentTimestamp = timestamp;\n\n\t return touchIsValid;\n\t };\n\n\t // detect version of mouse wheel event to use\n\t // via https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event\n\t var detectWheel = function detectWheel() {\n\t var wheelType = null;\n\n\t // Modern browsers support \"wheel\"\n\t if ('onwheel' in document.createElement('div')) {\n\t wheelType = 'wheel';\n\t } else {\n\t // Webkit and IE support at least \"mousewheel\"\n\t // or assume that remaining browsers are older Firefox\n\t wheelType = document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll';\n\t }\n\n\t return wheelType;\n\t };\n\n\t // runs callback functions\n\t var fireFunctions = function fireFunctions(type) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].type === type) {\n\t functionList[i].fn.call(undefined, type === 'input' ? currentInput : currentIntent);\n\t }\n\t }\n\t };\n\n\t // finds matching element in an object\n\t var objPos = function objPos(match) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].fn === match) {\n\t return i;\n\t }\n\t }\n\t };\n\n\t var detectScrolling = function detectScrolling(event) {\n\t if (mousePos.x !== event.screenX || mousePos.y !== event.screenY) {\n\t isScrolling = false;\n\n\t mousePos.x = event.screenX;\n\t mousePos.y = event.screenY;\n\t } else {\n\t isScrolling = true;\n\t }\n\t };\n\n\t // manual version of `closest()`\n\t var checkClosest = function checkClosest(elem, tag) {\n\t var ElementPrototype = window.Element.prototype;\n\n\t if (!ElementPrototype.matches) {\n\t ElementPrototype.matches = ElementPrototype.msMatchesSelector || ElementPrototype.webkitMatchesSelector;\n\t }\n\n\t if (!ElementPrototype.closest) {\n\t do {\n\t if (elem.matches(tag)) {\n\t return elem;\n\t }\n\n\t elem = elem.parentElement || elem.parentNode;\n\t } while (elem !== null && elem.nodeType === 1);\n\n\t return null;\n\t } else {\n\t return elem.closest(tag);\n\t }\n\t };\n\n\t /*\n\t * init\n\t */\n\n\t // don't start script unless browser cuts the mustard\n\t // (also passes if polyfills are used)\n\t if ('addEventListener' in window && Array.prototype.indexOf) {\n\t setUp();\n\t }\n\n\t /*\n\t * api\n\t */\n\n\t return {\n\t // returns string: the current input type\n\t // opt: 'intent'|'input'\n\t // 'input' (default): returns the same value as the `data-whatinput` attribute\n\t // 'intent': includes `data-whatintent` value if it's different than `data-whatinput`\n\t ask: function ask(opt) {\n\t return opt === 'intent' ? currentIntent : currentInput;\n\t },\n\n\t // returns string: the currently focused element or null\n\t element: function element() {\n\t return currentElement;\n\t },\n\n\t // overwrites ignored keys with provided array\n\t ignoreKeys: function ignoreKeys(arr) {\n\t ignoreMap = arr;\n\t },\n\n\t // overwrites specific char keys to update on\n\t specificKeys: function specificKeys(arr) {\n\t specificMap = arr;\n\t },\n\n\t // attach functions to input and intent \"events\"\n\t // funct: function to fire on change\n\t // eventType: 'input'|'intent'\n\t registerOnChange: function registerOnChange(fn, eventType) {\n\t functionList.push({\n\t fn: fn,\n\t type: eventType || 'input'\n\t });\n\t },\n\n\t unRegisterOnChange: function unRegisterOnChange(fn) {\n\t var position = objPos(fn);\n\n\t if (position || position === 0) {\n\t functionList.splice(position, 1);\n\t }\n\t },\n\n\t clearStorage: function clearStorage() {\n\t window.sessionStorage.clear();\n\t }\n\t };\n\t}();\n\n/***/ })\n/******/ ])\n});\n;"]} \ No newline at end of file diff --git a/dist/what-input.js b/dist/what-input.js index 30d09fb..22aa721 100644 --- a/dist/what-input.js +++ b/dist/what-input.js @@ -1,6 +1,6 @@ /** * what-input - A global utility for tracking the current input method (mouse, keyboard or touch). - * @version v5.2.5 + * @version v5.2.6 * @link https://github.com/ten1seven/what-input * @license MIT */ @@ -115,22 +115,7 @@ return /******/ (function(modules) { // webpackBootstrap var currentTimestamp = Date.now(); // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true` - var shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false'); - - if (shouldPersist) { - // check for session variables and use if available - try { - if (window.sessionStorage.getItem('what-input')) { - currentInput = window.sessionStorage.getItem('what-input'); - } - - if (window.sessionStorage.getItem('what-intent')) { - currentIntent = window.sessionStorage.getItem('what-intent'); - } - } catch (e) { - // fail silently - } - } + var shouldPersist = 'false'; // form input types var formInputs = ['button', 'input', 'select', 'textarea']; @@ -200,8 +185,6 @@ return /******/ (function(modules) { // webpackBootstrap inputMap[detectWheel()] = 'mouse'; addListeners(); - doUpdate('input'); - doUpdate('intent'); }; /* @@ -214,6 +197,8 @@ return /******/ (function(modules) { // webpackBootstrap // and are treated separately var options = supportsPassive ? { passive: true } : false; + document.addEventListener('DOMContentLoaded', setPersist); + // pointer events (mouse, pen, touch) if (window.PointerEvent) { window.addEventListener('pointerdown', setInput); @@ -245,6 +230,31 @@ return /******/ (function(modules) { // webpackBootstrap window.addEventListener('focusout', clearElement); }; + // checks if input persistence should happen and + // get saved state from session storage if true (defaults to `false`) + var setPersist = function setPersist() { + shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false'); + + if (shouldPersist) { + // check for session variables and use if available + try { + if (window.sessionStorage.getItem('what-input')) { + currentInput = window.sessionStorage.getItem('what-input'); + } + + if (window.sessionStorage.getItem('what-intent')) { + currentIntent = window.sessionStorage.getItem('what-intent'); + } + } catch (e) { + // fail silently + } + } + + // always run these so at least `initial` state is set + doUpdate('input'); + doUpdate('intent'); + }; + // checks conditions before updating new input var setInput = function setInput(event) { var eventKey = event.which; @@ -337,10 +347,12 @@ return /******/ (function(modules) { // webpackBootstrap }; var persistInput = function persistInput(which, value) { - try { - window.sessionStorage.setItem('what-' + which, value); - } catch (e) { - // fail silently + if (shouldPersist) { + try { + window.sessionStorage.setItem('what-' + which, value); + } catch (e) { + // fail silently + } } }; diff --git a/dist/what-input.min.js b/dist/what-input.min.js index 358f847..ce60d43 100644 --- a/dist/what-input.min.js +++ b/dist/what-input.min.js @@ -1,8 +1,8 @@ /** * what-input - A global utility for tracking the current input method (mouse, keyboard or touch). - * @version v5.2.5 + * @version v5.2.6 * @link https://github.com/ten1seven/what-input * @license MIT */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("whatInput",[],t):"object"==typeof exports?exports.whatInput=t():e.whatInput=t()}(this,function(){return i={},n.m=o=[function(e,t){"use strict";e.exports=function(){if("undefined"==typeof document||"undefined"==typeof window)return{ask:function(){return"initial"},element:function(){return null},ignoreKeys:function(){},specificKeys:function(){},registerOnChange:function(){},unRegisterOnChange:function(){}};var t=document.documentElement,n=null,s="initial",u=s,o=Date.now();if(!(t.getAttribute("data-whatpersist")||"false"===document.body.getAttribute("data-whatpersist")))try{window.sessionStorage.getItem("what-input")&&(s=window.sessionStorage.getItem("what-input")),window.sessionStorage.getItem("what-intent")&&(u=window.sessionStorage.getItem("what-intent"))}catch(e){}var d=["button","input","select","textarea"],i=[],c=[16,17,18,91,93],w=[],p={keydown:"keyboard",keyup:"keyboard",mousedown:"mouse",mousemove:"mouse",MSPointerDown:"pointer",MSPointerMove:"pointer",pointerdown:"pointer",pointermove:"pointer",touchstart:"touch",touchend:"touch"},r=!1,a={x:null,y:null},f={2:"touch",3:"touch",4:"mouse"},l=!1;try{var e=Object.defineProperty({},"passive",{get:function(){l=!0}});window.addEventListener("test",null,e)}catch(e){}var h=function(){var e=!!l&&{passive:!0};window.PointerEvent?(window.addEventListener("pointerdown",m),window.addEventListener("pointermove",y)):window.MSPointerEvent?(window.addEventListener("MSPointerDown",m),window.addEventListener("MSPointerMove",y)):(window.addEventListener("mousedown",m),window.addEventListener("mousemove",y),"ontouchstart"in window&&(window.addEventListener("touchstart",m,e),window.addEventListener("touchend",m))),window.addEventListener(S(),y,e),window.addEventListener("keydown",m),window.addEventListener("keyup",m),window.addEventListener("focusin",g),window.addEventListener("focusout",E)},m=function(e){var t=e.which,n=p[e.type];"pointer"===n&&(n=b(e));var o=!w.length&&-1===c.indexOf(t),i=w.length&&-1!==w.indexOf(t),r="keyboard"===n&&t&&(o||i)||"mouse"===n||"touch"===n;if(x(n)&&(r=!1),r&&s!==n&&(L("input",s=n),v("input")),r&&u!==n){var a=document.activeElement;a&&a.nodeName&&(-1===d.indexOf(a.nodeName.toLowerCase())||"button"===a.nodeName.toLowerCase()&&!k(a,"form"))&&(L("intent",u=n),v("intent"))}},v=function(e){t.setAttribute("data-what"+e,"input"===e?s:u),M(e)},y=function(e){var t=p[e.type];"pointer"===t&&(t=b(e)),O(e),(!r&&!x(t)||r&&"wheel"===e.type||"mousewheel"===e.type||"DOMMouseScroll"===e.type)&&u!==t&&(L("intent",u=t),v("intent"))},g=function(e){e.target.nodeName?(n=e.target.nodeName.toLowerCase(),t.setAttribute("data-whatelement",n),e.target.classList&&e.target.classList.length&&t.setAttribute("data-whatclasses",e.target.classList.toString().replace(" ",","))):E()},E=function(){n=null,t.removeAttribute("data-whatelement"),t.removeAttribute("data-whatclasses")},L=function(e,t){try{window.sessionStorage.setItem("what-"+e,t)}catch(e){}},b=function(e){return"number"==typeof e.pointerType?f[e.pointerType]:"pen"===e.pointerType?"touch":e.pointerType},x=function(e){var t=Date.now(),n="mouse"===e&&"touch"===s&&t-o<200;return o=t,n},S=function(){return"onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll"},M=function(e){for(var t=0,n=i.length;t { let currentTimestamp = Date.now() // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true` - const shouldPersist = !( - docElem.getAttribute('data-whatpersist') || - document.body.getAttribute('data-whatpersist') === 'false' - ) - - if (shouldPersist) { - // check for session variables and use if available - try { - if (window.sessionStorage.getItem('what-input')) { - currentInput = window.sessionStorage.getItem('what-input') - } - - if (window.sessionStorage.getItem('what-intent')) { - currentIntent = window.sessionStorage.getItem('what-intent') - } - } catch (e) { - // fail silently - } - } + let shouldPersist = 'false' // form input types const formInputs = ['button', 'input', 'select', 'textarea'] @@ -139,8 +121,6 @@ module.exports = (() => { inputMap[detectWheel()] = 'mouse' addListeners() - doUpdate('input') - doUpdate('intent') } /* @@ -153,6 +133,8 @@ module.exports = (() => { // and are treated separately const options = supportsPassive ? { passive: true } : false + document.addEventListener('DOMContentLoaded', setPersist) + // pointer events (mouse, pen, touch) if (window.PointerEvent) { window.addEventListener('pointerdown', setInput) @@ -184,6 +166,34 @@ module.exports = (() => { window.addEventListener('focusout', clearElement) } + // checks if input persistence should happen and + // get saved state from session storage if true (defaults to `false`) + const setPersist = () => { + shouldPersist = !( + docElem.getAttribute('data-whatpersist') || + document.body.getAttribute('data-whatpersist') === 'false' + ) + + if (shouldPersist) { + // check for session variables and use if available + try { + if (window.sessionStorage.getItem('what-input')) { + currentInput = window.sessionStorage.getItem('what-input') + } + + if (window.sessionStorage.getItem('what-intent')) { + currentIntent = window.sessionStorage.getItem('what-intent') + } + } catch (e) { + // fail silently + } + } + + // always run these so at least `initial` state is set + doUpdate('input') + doUpdate('intent') + } + // checks conditions before updating new input const setInput = event => { const eventKey = event.which @@ -298,10 +308,12 @@ module.exports = (() => { } const persistInput = (which, value) => { - try { - window.sessionStorage.setItem('what-' + which, value) - } catch (e) { - // fail silently + if (shouldPersist) { + try { + window.sessionStorage.setItem('what-' + which, value) + } catch (e) { + // fail silently + } } }