/**
* Attaches metadata to DOM elements for local utility purposes.
*
* @param {HTMLElement} element The DOM element to attach metadata to.
* @param {object} metadata An object containing metadata properties.
* @returns {void}
* @throws {TypeError} If element is not an HTMLElement.
*/
function attachMetadata(element, metadata) {
if (!(element instanceof HTMLElement)) {
throw new TypeError("Element must be an HTMLElement.");
}
if (typeof metadata !== 'object' || metadata === null) {
console.warn("Metadata must be an object. Ignoring.");
return;
}
const elementMetadata = element.dataset || {}; // Use dataset if available
for (const key in metadata) {
if (metadata.hasOwnProperty(key)) {
const value = metadata[key];
// Defensive check: Ensure value is a primitive or an object that can be stringified.
if (typeof value !== 'undefined') {
try {
elementMetadata[key] = JSON.stringify(value); // Store metadata as string
} catch (error) {
console.warn(`Could not stringify metadata for key "${key}". Ignoring.`);
}
}
}
}
if (element.dataset) {
Object.assign(element.dataset, elementMetadata); // Merge with dataset
} else {
Object.assign(element, elementMetadata); //Otherwise, directly assign to element
}
}
Add your comment