element-closest
Version:
Return the closest element matching a selector up the DOM tree
92 lines (65 loc) • 3.28 kB
Markdown
# closest [<img src="https://jonneal.dev/dom-logo.svg" alt="closest" width="90" height="90" align="right">][closest]
[<img alt="npm version" src="https://img.shields.io/npm/v/element-closest.svg" height="20">](https://www.npmjs.com/package/element-closest)
[<img alt="build status" src="https://img.shields.io/travis/jonathantneal/closest/master.svg" height="20">](https://travis-ci.org/jonathantneal/closest)
[<img alt="support chat" src="https://img.shields.io/badge/support-chat-blue.svg" height="20">](https://gitter.im/postcss/postcss)
[closest] is a polyfill for [`#Element.closest`].
```bash
npm install element-closest
```
The [`#Element.closest`] method returns the closest element that matches a selector. It returns the element itself, one of its ancestor, or `null` if there isn't any match.
```js
element.closest(selectorString) //=> Element or null
```
This is especially useful for delegating events.
```js
document.addEventListener('click', function (event) {
// find nearest element up the tree that is an <a>
var link = event.target.closest('a');
if (link) {
// do something with the <a>
event.preventDefault();
}
});
```
The script is approximately 428 bytes, or 257 bytes when gzipped.
## Usage
For immediate usage, add this script to your document:
```html
<script src="https://unpkg.com/element-closest"></script>
```
For usage in Node, including Browserify and Webpack, run [closest] with your `window` object:
```js
const elementClosest = require('element-closest');
elementClosest(window); // this is used to reference window.Element
```
## Browser compatibility
| Browser | Native Support | Polyfill Support |
| ----------------- | -------------- | ---------------- |
| Android | 53 | 2.2+ |
| Blackberry | ✘ | 7+ |
| Chrome | 41+ | 4 - 40 |
| Edge | 15 | 12 - 14 |
| Firefox | 35+ | 3.5 - 34 |
| Internet Explorer | ✘ | 8+ |
| Opera | 28+ | 10 - 27 |
| Opera Mobile | 37+ | 12+ |
| Safari (iOS) | 9.2+ | 3.2 - 8.4 |
| Safari (MacOS) | 9.1+ | 3.1 - 8 |
### Internet Explorer 8
`closest` is especially useful for delegating events, but remember that Internet Explorer 8 does not support [`#Element.addEventListener`].
## matches
This library also polyfills [`#Element.matches`], which is widely supported but often vendor-prefixed.
```js
element.matches(selectorString) //=> boolean
```
`matches` is especially useful for short-handing `hasAttribute` or `classList.contains` with selectors.
```js
const widget = document.querySelector('.custom-widget');
if (widget.matches('[data-active]') || widget.matches('.widget--active')) {
// do something with the active widget
}
```
[`#Element.closest`]: https://dom.spec.whatwg.org/#dom-element-closest
[`#Element.matches`]: https://dom.spec.whatwg.org/#dom-element-matches
[`#Element.addEventListener`]: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Browser_compatibility
[closest]: https://github.com/jonathantneal/closest