I am using javascript to process DOM attributes on page load.
I have markup with elements which contain data-*
attributes:
<section>
<h2 data-fruit-apples="sdlfls">Heading</h2>
<p data-vegetables-carrots="sdjjasd">Paragraph</p>
<ul>
<li data-fruit-cherries="sdfada" data-fruit-bananas="adada">List Item</li>
<li>List Item</li>
</ul>
<p data-fruit-pears="rtfadds">Paragraph</p>
<p>Paragraph</p>
</section>
I'd like to process all the data-fruit-*
attributes.
But how can I select all the elements with data-*
attributes beginning with data-fruit
?
I know I can use ^=
to pattern match the start of a data-*
attribute value.
Is there anything I can use to pattern match the start of a data-*
attribute name?
My attempt would be something like this:
// Set up variables
const mySection = document.getElementsByTagName('section')[0];
let allDataElements = [];
let nonFruitDataElements = [];
// Build allDataElements
[... mySection.querySelectorAll('*')].forEach((element) => {
if (Object.keys(element.dataset).length > 0) {
allDataElements.push(...(Object.keys(element.dataset)));
}
});
// Build nonFruitDataElements
allDataElements.forEach((element) => {
if (element.substr(0, 5) !== 'fruit') {
nonFruitDataElements.push(element);
}
});
// Subtract nonFruitDataElements from allDataElements
fruitDataElements = allDataElements.filter(x => !nonFruitDataElements.includes(x));
// Log fruitDataElements
console.log(fruitDataElements);
<section>
<h2 data-fruit-apples="sdlfls">Heading</h2>
<p data-vegetables-carrots="sdjjasd">Paragraph</p>
<ul>
<li data-fruit-cherries="sdfada" data-fruit-bananas="adada">List Item</li>
<li>List Item</li>
</ul>
<p data-fruit-pears="rtfadds">Paragraph</p>
<p>Paragraph</p>
</section>
But this seems really longwinded.