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.