201 lines
6 KiB
Markdown
201 lines
6 KiB
Markdown
# DOM Selector
|
|
|
|
[![build](https://github.com/asamuzaK/domSelector/actions/workflows/node.js.yml/badge.svg)](https://github.com/asamuzaK/domSelector/actions/workflows/node.js.yml)
|
|
[![CodeQL](https://github.com/asamuzaK/domSelector/actions/workflows/codeql.yml/badge.svg)](https://github.com/asamuzaK/domSelector/actions/workflows/codeql.yml)
|
|
[![npm (scoped)](https://img.shields.io/npm/v/@asamuzakjp/dom-selector)](https://www.npmjs.com/package/@asamuzakjp/dom-selector)
|
|
|
|
A CSS selector engine.
|
|
Used in jsdom since [jsdom v23.2.0](https://github.com/jsdom/jsdom/releases/tag/23.2.0).
|
|
|
|
## Install
|
|
|
|
```console
|
|
npm i @asamuzakjp/dom-selector
|
|
```
|
|
|
|
## Usage
|
|
|
|
```javascript
|
|
import {
|
|
matches, closest, querySelector, querySelectorAll
|
|
} from '@asamuzakjp/dom-selector';
|
|
```
|
|
|
|
<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
|
|
|
|
### matches(selector, node, opt)
|
|
|
|
matches - same functionality as [Element.matches()][64]
|
|
|
|
#### Parameters
|
|
|
|
- `selector` **[string][59]** CSS selector
|
|
- `node` **[object][60]** Element node
|
|
- `opt` **[object][60]?** options
|
|
- `opt.warn` **[boolean][61]?** console warn e.g. unsupported pseudo-class
|
|
|
|
Returns **[boolean][61]** `true` if matched, `false` otherwise
|
|
|
|
|
|
### closest(selector, node, opt)
|
|
|
|
closest - same functionality as [Element.closest()][65]
|
|
|
|
#### Parameters
|
|
|
|
- `selector` **[string][59]** CSS selector
|
|
- `node` **[object][60]** Element node
|
|
- `opt` **[object][60]?** options
|
|
- `opt.warn` **[boolean][61]?** console warn e.g. unsupported pseudo-class
|
|
|
|
Returns **[object][60]?** matched node
|
|
|
|
|
|
### querySelector(selector, node, opt)
|
|
|
|
querySelector - same functionality as [Document.querySelector()][66], [DocumentFragment.querySelector()][67], [Element.querySelector()][68]
|
|
|
|
#### Parameters
|
|
|
|
- `selector` **[string][59]** CSS selector
|
|
- `node` **[object][60]** Document, DocumentFragment or Element node
|
|
- `opt` **[object][60]?** options
|
|
- `opt.warn` **[boolean][61]?** console warn e.g. unsupported pseudo-class
|
|
|
|
Returns **[object][60]?** matched node
|
|
|
|
|
|
### querySelectorAll(selector, node, opt)
|
|
|
|
querySelectorAll - same functionality as [Document.querySelectorAll()][69], [DocumentFragment.querySelectorAll()][70], [Element.querySelectorAll()][71]
|
|
**NOTE**: returns Array, not NodeList
|
|
|
|
#### Parameters
|
|
|
|
- `selector` **[string][59]** CSS selector
|
|
- `node` **[object][60]** Document, DocumentFragment or Element node
|
|
- `opt` **[object][60]?** options
|
|
- `opt.warn` **[boolean][61]?** console warn e.g. unsupported pseudo-class
|
|
|
|
Returns **[Array][62]<([object][60] \| [undefined][63])>** array of matched nodes
|
|
|
|
|
|
## Supported CSS selectors
|
|
|
|
|Pattern|Supported|Note|
|
|
|:--------|:-------:|:--------|
|
|
|\*|✓| |
|
|
|ns\|E|✓| |
|
|
|\*\|E|✓| |
|
|
|\|E|✓| |
|
|
|E|✓| |
|
|
|E:not(s1, s2, …)|✓| |
|
|
|E:is(s1, s2, …)|✓| |
|
|
|E:where(s1, s2, …)|✓| |
|
|
|E:has(rs1, rs2, …)|✓| |
|
|
|E.warning|✓| |
|
|
|E#myid|✓| |
|
|
|E\[foo\]|✓| |
|
|
|E\[foo="bar"\]|✓| |
|
|
|E\[foo="bar" i\]|✓| |
|
|
|E\[foo="bar" s\]|✓| |
|
|
|E\[foo~="bar"\]|✓| |
|
|
|E\[foo^="bar"\]|✓| |
|
|
|E\[foo$="bar"\]|✓| |
|
|
|E\[foo*="bar"\]|✓| |
|
|
|E\[foo\|="en"\]|✓| |
|
|
|E:defined|Unsupported| |
|
|
|E:dir(ltr)|✓| |
|
|
|E:lang(en)|Partially supported|Comma-separated list of language codes, e.g. `:lang(en, fr)`, is not yet supported.|
|
|
|E:any‑link|✓| |
|
|
|E:link|✓| |
|
|
|E:visited|✓|Returns `false` or `null` to prevent fingerprinting.|
|
|
|E:local‑link|✓| |
|
|
|E:target|✓| |
|
|
|E:target‑within|✓| |
|
|
|E:scope|✓| |
|
|
|E:current|Unsupported| |
|
|
|E:current(s)|Unsupported| |
|
|
|E:past|Unsupported| |
|
|
|E:future|Unsupported| |
|
|
|E:active|Unsupported| |
|
|
|E:hover|Unsupported| |
|
|
|E:focus|✓| |
|
|
|E:focus‑within|✓| |
|
|
|E:focus‑visible|Unsupported| |
|
|
|E:enabled<br>E:disabled|✓| |
|
|
|E:read‑write<br>E:read‑only|✓| |
|
|
|E:placeholder‑shown|✓| |
|
|
|E:default|✓| |
|
|
|E:checked|✓| |
|
|
|E:indeterminate|✓| |
|
|
|E:valid<br>E:invalid|✓| |
|
|
|E:required<br>E:optional|✓| |
|
|
|E:blank|Unsupported| |
|
|
|E:user‑invalid|Unsupported| |
|
|
|E:root|✓| |
|
|
|E:empty|✓| |
|
|
|E:nth‑child(n [of S]?)|✓| |
|
|
|E:nth‑last‑child(n [of S]?)|✓| |
|
|
|E:first‑child|✓| |
|
|
|E:last‑child|✓| |
|
|
|E:only‑child|✓| |
|
|
|E:nth‑of‑type(n)|✓| |
|
|
|E:nth‑last‑of‑type(n)|✓| |
|
|
|E:first‑of‑type|✓| |
|
|
|E:last‑of‑type|✓| |
|
|
|E:only‑of‑type|✓| |
|
|
|E F|✓| |
|
|
|E > F|✓| |
|
|
|E + F|✓| |
|
|
|E ~ F|✓| |
|
|
|F \|\| E|Unsupported| |
|
|
|E:nth‑col(n)|Unsupported| |
|
|
|E:nth‑last‑col(n)|Unsupported| |
|
|
|:host|✓| |
|
|
|:host(s)|✓| |
|
|
|:host‑context(s)|✓| |
|
|
|
|
|
|
<!--
|
|
### Performance
|
|
|
|
TODO: rewrite benchmark table
|
|
-->
|
|
|
|
|
|
## Acknowledgments
|
|
|
|
The following resources have been of great help in the development of the DOM Selector.
|
|
|
|
- [CSSTree](https://github.com/csstree/csstree)
|
|
- [selery](https://github.com/danburzo/selery)
|
|
- [jsdom](https://github.com/jsdom/jsdom)
|
|
|
|
|
|
---
|
|
Copyright (c) 2023 [asamuzaK (Kazz)](https://github.com/asamuzaK/)
|
|
|
|
|
|
[1]: #matches
|
|
[2]: #parameters
|
|
[3]: #closest
|
|
[4]: #parameters-1
|
|
[5]: #queryselector
|
|
[6]: #parameters-2
|
|
[7]: #queryselectorall
|
|
[8]: #parameters-3
|
|
[59]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
|
|
[60]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
|
|
[61]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean
|
|
[62]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array
|
|
[63]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined
|
|
[64]: https://developer.mozilla.org/docs/Web/API/Element/matches
|
|
[65]: https://developer.mozilla.org/docs/Web/API/Element/closest
|
|
[66]: https://developer.mozilla.org/docs/Web/API/Document/querySelector
|
|
[67]: https://developer.mozilla.org/docs/Web/API/DocumentFragment/querySelector
|
|
[68]: https://developer.mozilla.org/docs/Web/API/Element/querySelector
|
|
[69]: https://developer.mozilla.org/docs/Web/API/Document/querySelectorAll
|
|
[70]: https://developer.mozilla.org/docs/Web/API/DocumentFragment/querySelectorAll
|
|
[71]: https://developer.mozilla.org/docs/Web/API/Element/querySelectorAll
|