Not concerned about old browser fallback. Also, can't use libraries.
I have an event object. I am testing the event.target against a css selector via matchesSelector:
event['target'].matchesSelector('css selector here');
this works, as does:
event['target']['parentElement'].matchesSelector('css selector here');
...and:
event['target']['parentElement']['parentElement'].matchesSelector('css selector here');
What I'm looking for is some possible object method beyond my understanding that I could use to check each parentElement all the way up for a match, without a for
loop. My focus is on efficiency.
Thanks!
The closest() function will do what you need.
It starts from the element itself, and traverses parents (heading toward the document root) until it finds a node that matches the provided selectorString. Somewhat similar to jQuery's parents()
function.
So your code will look like that:
event.target.closest(selectorString)
To prevent redundant looping through all parent elements of your target element, you can perform quick checking for whether your element is inside of an element that matches your selector by using matchesSelector()
with selector that is concatenation of your original selector and appended context selector consisting of space and your target-element's tag name:
function getAncestorBySelector(elem, selector) {
if (!elem.matchesSelector(selector + ' ' + elem.tagName)) {
// If element is not inside needed element, returning immediately.
return null;
}
// Loop for finding an ancestor element that matches your selector.
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With