From 5dc6417d036c35c8029ba481318f47df4fda2d60 Mon Sep 17 00:00:00 2001 From: "Kyle J. Kress" Date: Thu, 29 Jun 2017 19:43:15 -0600 Subject: [PATCH] Element matches and closest --- src/DOM/Node/Element.js | 34 ++++++++++++++++++++++++++++++++++ src/DOM/Node/Element.purs | 5 +++++ 2 files changed, 39 insertions(+) diff --git a/src/DOM/Node/Element.js b/src/DOM/Node/Element.js index 116a511..b743d50 100644 --- a/src/DOM/Node/Element.js +++ b/src/DOM/Node/Element.js @@ -95,6 +95,40 @@ exports.removeAttribute = function (name) { }; }; +// `matches` polyfill (https://caniuse.com/#feat=matchesselector) +if (typeof Element.prototype.matches !== "function") { + Element.prototype.matches = + Element.prototype.msMatchesSelector + || Element.prototype.webkitMatchesSelector + || Element.prototype.oMatchesSelector + || Element.prototype.mozMatchesSelector; +} + +exports.matches = function (selector) { + return function (element) { + return element.matches(selector); + } +} + +// `closest` polyfill (https://caniuse.com/#feat=element-closest) +if (typeof Element.prototype.closest !== "function") { + Element.prototype.closest = function closest(selector) { + return (function searchUpTree(selector, element) { + return element == null + ? null + : element.matches(selector) + ? element + : searchUpTree(selector, element.parentElement); + }(selector, this)); + } +} + +exports.closest = function (selector) { + return function (element) { + return element.closest(selector); + } +} + // - CSSOM --------------------------------------------------------------------- exports.scrollTop = function (node) { diff --git a/src/DOM/Node/Element.purs b/src/DOM/Node/Element.purs index 9638c32..562115b 100644 --- a/src/DOM/Node/Element.purs +++ b/src/DOM/Node/Element.purs @@ -13,6 +13,8 @@ module DOM.Node.Element , setAttribute , getAttribute , removeAttribute + , matches + , closest , scrollTop , setScrollTop , scrollLeft @@ -65,6 +67,9 @@ getAttribute attr = map toMaybe <<< _getAttribute attr foreign import _getAttribute :: forall eff. String -> Element -> Eff (dom :: DOM | eff) (Nullable String) foreign import removeAttribute :: forall eff. String -> Element -> Eff (dom :: DOM | eff) Unit +foreign import matches :: forall eff. String -> Element -> Eff (dom :: DOM | eff) Boolean +foreign import closest :: forall eff. String -> Element -> Eff (dom :: DOM | eff) (Nullable Element) + foreign import scrollTop :: forall eff. Element -> Eff (dom :: DOM | eff) Number foreign import setScrollTop :: forall eff. Number -> Element -> Eff (dom :: DOM | eff) Unit