diff options
| author | Johann-S <[email protected]> | 2017-08-21 16:45:29 +0200 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2019-02-20 22:05:45 +0200 |
| commit | d6560bbc81f2e4a4c3c19a7ea9c7269df2594580 (patch) | |
| tree | 0832e32780bd4c73eb962ed094901f62691831c5 /js | |
| parent | 0b16c8c6d9a9690d537bd08eac8a8292ebf938cd (diff) | |
| download | bootstrap-d6560bbc81f2e4a4c3c19a7ea9c7269df2594580.tar.xz bootstrap-d6560bbc81f2e4a4c3c19a7ea9c7269df2594580.zip | |
better polyfill for closest and matches functions
Diffstat (limited to 'js')
| -rw-r--r-- | js/src/dom/selectorEngine.js | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/js/src/dom/selectorEngine.js b/js/src/dom/selectorEngine.js index f6bcf6da2..1b33bf62d 100644 --- a/js/src/dom/selectorEngine.js +++ b/js/src/dom/selectorEngine.js @@ -5,8 +5,45 @@ * -------------------------------------------------------------------------- */ +// 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 + } + + do { + if (fnMatches.call(ancestor, selector)) { + return ancestor + } + + ancestor = ancestor.parentElement + } while (ancestor !== null) + + return null + } +} else { + fnClosest = (element, selector) => { + return element.closest(selector) + } +} + const SelectorEngine = { - matches: Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector, + matches(element, selector) { + return fnMatches.call(element, selector) + }, find(selector) { if (typeof selector !== 'string') { @@ -22,20 +59,7 @@ const SelectorEngine = { }, closest(element, selector) { - let ancestor = element - if (!document.documentElement.contains(element)) { - return null - } - - do { - if (SelectorEngine.matches.call(ancestor, selector)) { - return ancestor - } - - ancestor = ancestor.parentElement - } while (ancestor !== null) - - return null + return fnClosest(element, selector) } } |
