@drupal/once
Mark DOM elements as processed to prevent multiple initializations.
Examples
<script type="module">
import once from 'https://unpkg.com/@drupal/once/src/once.js';
const elements = once('my-once-id', 'div');
elements.forEach(el => el.innerHTML = 'processed');
</script>
<script src="https://unpkg.com/@drupal/once"></script>
<script>
const elements = once('my-once-id', 'div');
elements.forEach(el => el.innerHTML = 'processed');
</script>
<script src="https://unpkg.com/@drupal/once"></script>
<script>
const [myElement] = once('my-once-id', document.body);
const myElement = once('my-once-id', document.body).shift();
</script>
API
once(id, selector, [context]) ⇒ Array.<Element>
Ensures a JavaScript callback is only executed once on a set of elements.
Filters a NodeList or array of elements, removing those already processed
by a callback with a given id.
This method adds a data-once
attribute on DOM elements. The value of
this attribute identifies if a given callback has been executed on that
element.
Kind: global function
Returns: Array.<Element>
- An array of elements that have not yet been processed by a once call
with a given id.
Param | Type | Default | Description |
---|
id | string | | The id of the once call. |
selector | NodeList | Array.<Element> | Element | string | | A NodeList or array of elements. |
[context] | Document | Element | document | An element to use as context for querySelectorAll. |
Example (Basic usage)
const elements = once('my-once-id', '[data-myelement]');
Example (Input parameters accepted)
once('my-once-id', document.querySelectorAll('[data-myelement]'));
once('my-once-id', jQuery('[data-myelement]'));
once('my-once-id', '[data-myelement]');
once('my-once-id', '[data-myelement]', document.head);
once('my-once-id', document.querySelector('#some-id'));
Example (Using a single element)
const [myElement] = once('my-once-id', document.body);
const myElement = once('my-once-id', document.body).shift();
once.remove(id, selector, [context]) ⇒ Array.<Element>
Removes a once id from an element's data-drupal-once attribute value.
If a once id is removed from an element's data-drupal-once attribute value,
the JavaScript callback associated with that id can be executed on that
element again.
Kind: static method of once
Returns: Array.<Element>
- A filtered array of elements that had been processed by the provided id,
and are now able to be processed again.
Param | Type | Default | Description |
---|
id | string | | The id of a once call. |
selector | NodeList | Array.<Element> | Element | string | | A NodeList or array of elements to remove the once id from. |
[context] | Document | Element | document | An element to use as context for querySelectorAll. |
Example (Basic usage)
const elements = once.remove('my-once-id', '[data-myelement]');
Example (Input parameters accepted)
once.remove('my-once-id', document.querySelectorAll('[data-myelement]'));
once.remove('my-once-id', jQuery('[data-myelement]'));
once.remove('my-once-id', '[data-myelement]');
once.remove('my-once-id', '[data-myelement]', document.head);
once.remove('my-once-id', document.querySelector('#some-id'));
once.filter(id, selector, [context]) ⇒ Array.<Element>
Finds elements that have been processed by a given once id.
Behaves like once and remove without changing the DOM.
To select all DOM nodes processed by a given id, use find.
Kind: static method of once
Returns: Array.<Element>
- A filtered array of elements that have already been processed by the
provided once id.
Param | Type | Default | Description |
---|
id | string | | The id of the once call. |
selector | NodeList | Array.<Element> | Element | string | | A NodeList or array of elements to remove the once id from. |
[context] | Document | Element | document | An element to use as context for querySelectorAll. |
Example (Basic usage)
const filteredElements = once.filter('my-once-id', '[data-myelement]');
Example (Input parameters accepted)
once.filter('my-once-id', document.querySelectorAll('[data-myelement]'));
once.filter('my-once-id', jQuery('[data-myelement]'));
once.filter('my-once-id', '[data-myelement]');
once.filter('my-once-id', '[data-myelement]', document.head);
once.filter('my-once-id', document.querySelector('#some-id'));
once.find([id], [context]) ⇒ Array.<Element>
Finds elements that have been processed by a given once id.
Query the 'context' element for elements that already have the
corresponding once id value.
Kind: static method of once
Returns: Array.<Element>
- A filtered array of elements that have already been processed by the
provided once id.
Param | Type | Default | Description |
---|
[id] | string | | The id of the once call. |
[context] | Document | Element | document | Scope of the search for matching elements. |
Example (Basic usage)
const oncedElements = once.find('my-once-id');
Example (Input parameters accepted)
once.find();
once.find('my-once-id');
once.find('my-once-id', document.head);