diff options
Diffstat (limited to 'js/src/dom/selectorEngine.js')
| -rw-r--r-- | js/src/dom/selectorEngine.js | 122 |
1 files changed, 66 insertions, 56 deletions
diff --git a/js/src/dom/selectorEngine.js b/js/src/dom/selectorEngine.js index 0cff83ef9..99dc26b79 100644 --- a/js/src/dom/selectorEngine.js +++ b/js/src/dom/selectorEngine.js @@ -5,76 +5,86 @@ * -------------------------------------------------------------------------- */ -// matches polyfill (see: https://mzl.la/2ikXneG) -let fnMatches = null -if (!Element.prototype.matches) { - fnMatches = - Element.prototype.msMatchesSelector || - Element.prototype.webkitMatchesSelector -} else { - fnMatches = Element.prototype.matches -} - -// closest polyfill (see: https://mzl.la/2vXggaI) -let fnClosest = null -if (!Element.prototype.closest) { - fnClosest = (element, selector) => { - let ancestor = element - if (!document.documentElement.contains(element)) { - return null - } +const SelectorEngine = (() => { - do { - if (fnMatches.call(ancestor, selector)) { - return ancestor - } - ancestor = ancestor.parentElement - } while (ancestor !== null) + /** + * ------------------------------------------------------------------------ + * Polyfills + * ------------------------------------------------------------------------ + */ - return null + // matches polyfill (see: https://mzl.la/2ikXneG) + let fnMatches = null + if (!Element.prototype.matches) { + fnMatches = + Element.prototype.msMatchesSelector || + Element.prototype.webkitMatchesSelector + } else { + fnMatches = Element.prototype.matches } -} else { - // eslint-disable-next-line arrow-body-style - fnClosest = (element, selector) => { - return element.closest(selector) - } -} -const SelectorEngine = { - matches(element, selector) { - return fnMatches.call(element, selector) - }, + // closest polyfill (see: https://mzl.la/2vXggaI) + let fnClosest = null + if (!Element.prototype.closest) { + fnClosest = (element, selector) => { + let ancestor = element + if (!document.documentElement.contains(element)) { + return null + } + + do { + if (fnMatches.call(ancestor, selector)) { + return ancestor + } + + ancestor = ancestor.parentElement + } while (ancestor !== null) - find(selector, element = document) { - if (typeof selector !== 'string') { return null } - - if (selector.indexOf('#') === 0) { - return SelectorEngine.findOne(selector, element) + } else { + // eslint-disable-next-line arrow-body-style + fnClosest = (element, selector) => { + return element.closest(selector) } + } - return element.querySelectorAll(selector) - }, + return { + matches(element, selector) { + return fnMatches.call(element, selector) + }, - findOne(selector, element = document) { - if (typeof selector !== 'string') { - return null - } + find(selector, element = document) { + if (typeof selector !== 'string') { + return null + } - let selectorType = 'querySelector' - if (selector.indexOf('#') === 0) { - selectorType = 'getElementById' - selector = selector.substr(1, selector.length) - } + if (selector.indexOf('#') === 0) { + return SelectorEngine.findOne(selector, element) + } + + return element.querySelectorAll(selector) + }, - return element[selectorType](selector) - }, + findOne(selector, element = document) { + if (typeof selector !== 'string') { + return null + } + + let selectorType = 'querySelector' + if (selector.indexOf('#') === 0) { + selectorType = 'getElementById' + selector = selector.substr(1, selector.length) + } - closest(element, selector) { - return fnClosest(element, selector) + return element[selectorType](selector) + }, + + closest(element, selector) { + return fnClosest(element, selector) + } } -} +})() export default SelectorEngine |
