# 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'; ``` ### 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
E:disabled|✓| | |E:read‑write
E:read‑only|✓| | |E:placeholder‑shown|✓| | |E:default|✓| | |E:checked|✓| | |E:indeterminate|✓| | |E:valid
E:invalid|✓| | |E:required
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)|✓| | ## 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