https://github.com/peternaydenov/dom-selector
DOM selections and DOM references organizer
https://github.com/peternaydenov/dom-selector
dom reference selection selectors
Last synced: 10 months ago
JSON representation
DOM selections and DOM references organizer
- Host: GitHub
- URL: https://github.com/peternaydenov/dom-selector
- Owner: PeterNaydenov
- License: mit
- Created: 2023-11-16T19:34:31.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-04-26T15:14:44.000Z (about 1 year ago)
- Last Synced: 2025-04-26T16:25:10.691Z (about 1 year ago)
- Topics: dom, reference, selection, selectors
- Language: JavaScript
- Homepage:
- Size: 1.2 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: Changelog.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README

# DOM Selector ( @peter.naydenov/dom-selector )




## Description
Keep all DOM selections and DOM references organized in a single space. Avoid long and difficult-to-read select operations in your code by using simple and meaningful names instead.
Framework agnostic. No dependencies.
## Methods
`DOM Selector` provides only 4 methods:
```js
define : 'Define a new selection'
, remember : 'Store a DOM reference directly as a last result without creating a selection.'
, run : 'Run a selection'
, use : 'Use the last result of the selection or remembered DOM reference'
```
## Installation
```
npm install @peter.naydenov/dom-selector
```
From the project:
```js
import domSelector from '@peter.naydenov/dom-selector';
// or require it:
// const domSelector = require('@peter.naydenov/dom-selector');
const dom = domSelector();
// Ready to use
```
## How to use it
```js
import domSelector from '@peter.naydenov/dom-selector';
const dom = domSelector();
// Define a selection
dom.define ({
name: 'li'
, selector: () => document.querySelectorAll ( 'li' )
})
// Run a selection. Result is always an array
dom.run ( 'li' )
// Method 'use' will use the last result of the selection.
for ( let item of dom.use ( 'li' )) {
// do something with the item
}
// Example:
dom.define ({
name: 'nav' // name of the selection
, selector: ( ...extra ) => document.getElementById ( 'nav' )
// ...extra -> extra arguments coming from the 'run' function
, direction : 'none'
// Direction is a extra scan instruction applied to the result of the selector.
// Values: 'up', 'down' or 'none'.
// 'none' -> will not expand the result.
// 'up' -> will expand the result with all parent DOM nodes to the tag.
// 'down' -> will expand the result with all child DOM nodes.
// If 'direction' is not specified, the default value is 'none'.
, where : ({ item, i, END, length, up, down }, ...extra) => item.tagName === 'LI' ? item : null
// item -> selector element
// i -> index of the selector element
// length -> length of the result array
// END -> Symbol to stop the scan
// up -> up() function returns a list of all parent DOM nodes.
// down -> down() function returns a list of all nested DOM nodes.
// ...extra -> extra argument coming from the 'run' function
})
// dom.run ( 'nav') -> will collect all
dom.run ( 'nav', extra ).map ( item => {
// do something with the
})
```
## Definition of Selection
```js
const selection = {
name: 'mySelection' // *required. A unique name for the selection
, selector: () => document.querySelector('div') // *required. A function that returns a DOM node or list of DOM node references
, direction : 'up' // optional. Values: 'none', 'up' or 'down'. Default: 'none'.
, where : ({ item, i, END, length, up, down }) => item.classList.contains('myClass') ? item : null
// optional. A function that can filter nodes from selector function. Returns item to include it in selection, null for removing the item from the selection or END to stop the selection process. Use 'up' and 'down' arguments are functions to get the list of nodes in the current direction.
}
// Example:
// Select only
const selection = {
name: 'li-span'
, selector: () => document.querySelectorAll ( 'li' )
, where : ({ item, i, END, length, up, down }) => {
let hasSpan = false;
for ( let child of down(item) ) { // down(item) -> returns a list of all nested DOM nodes
if ( child.tagName === 'SPAN' ) hasSpan = true;
}
return hasSpan ? item : null;
}
}
// Respectively 'up' function returns a list of all parent DOM nodes.
```
- `selector` : A function that returns a DOM node or list of DOM node references. If the function returns a list of DOM nodes, `DOM Selector` will use them as a result. If the function returns a single DOM node, `DOM Selector` will use it as a starting point for DOM scanning and will return a list of DOM nodes according to the `direction` property;
- `direction`: If the selector function returns a single DOM node, `DOM Selector` will use it as a starting point for DOM scanning and will return a list of DOM nodes according to the `direction` property. Value 'up' will scan the DOM tree parents up to tag. Value 'down' will scan the DOM tree children down to the last child. Default: 'down'. This property is ignored if the selector function returns a list of DOM nodes;
- `where`: Optional. A function that can filter nodes from selector function. Returns the item to select, null to remove. Return END to stop the selection process;
## Examples
### Collect child elements of selected element
```js
dom.define ({ // Define a selector. Result should be filtered (only elements that are
name: 'children'
, selector: () => document.querySelector ( '.nav' )
, direction: 'down' // Extends the selector result with all child DOM nodes
, where: ({item, i, END, length, down, up }, selectedTagName ) => item.tagName === selectedTagName ? item : null
// Function 'where' will recieve extra arguments from the 'run' function
})
let r = null
r = dom.run ( 'children', 'LI' ) // 'LI' is a selectedTagName
// --> r will contain list of all
// If I want to collect only span elements from the navigation menu:
r = dom.run ( 'children', 'SPAN' )
// --> r will contain list of all children of element with class 'nav'
// Alternative way - don't use direction property:
dom.define ({
name: 'children-span'
, selector: () => document.querySelector ( '.nav' )
, where: ({item, i, END, length, down, up }) => {
// item here is a full navigation block
const res = [];
for ( let child of down(item) ) { // down(item) -> returns a list of all nested DOM nodes
if ( child.tagName === 'SPAN' ) res.push ( child )
}
return res
} // where func.
})
r = dom.run ( 'children-span' )
// --> r will contain list of all children of element with class 'nav'
```
### Parameterized selector
elements that have inside
## Links
## Credits
## License
Selector can recive parameters and can be parameterized. Here is an example:
```js
dom.define ({ // Define a parameterized selector. Result should be filtered (only elements that contains SPAN )
name: 'has-span'
, selector: ( target ) => document.querySelectorAll ( target )
, where: ({item, i, END, length, down, up }) => {
let res =[];
for ( let child of down(item) ) {
if ( child.tagName === 'SPAN' ) res.push ( item )
}
return res
} // where
})
let r = null
r = dom.run ( 'has-span', 'a' )
// --> r will contain list of all elements that have inside
r = dom.run ( 'has-span', 'li' )
// --> r will contain list of all
r = dom.run ( 'has-span', 'p' )
// --> r will contain list of all
```
Here is another example:
```js
dom.define ({ // Define a parameterized selector. Result should be filtered (only elements that contains SPAN )
name: 'siblings'
, selector: ( target ) => target.parentElement.children
})
let r = null
// let's have a reference to a single DOM element
const node = document.querySelector ( 'li' )
r = dom.run ( 'siblings', node )
// --> r will contain list of all
```
- [History of changes](https://github.com/PeterNaydenov/dom-selector/blob/main/Changelog.md)
- [Migration guide](https://github.com/PeterNaydenov/dom-selector/blob/main/Migration.guide.md)
'@peter.naydenov/dom-selector' was created and supported by Peter Naydenov.
'@peter.naydenov/dom-selector' is released under the [MIT License](http://opensource.org/licenses/MIT).