Use MutationObserver to detect DOM modifications
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
console.log('DOM changed:', mutation.type);
});
});
observer.observe(element, {
childList: true,
subtree: true,
attributes: true
});// Watch for new elements
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1) {
console.log('Element added:', node.tagName);
}
});
}
if (mutation.type === 'attributes') {
console.log(`Attribute ${mutation.attributeName} changed`);
}
});
});
// Start observing
const container = document.querySelector('#container');
observer.observe(container, {
childList: true, // Watch for children changes
subtree: true, // Watch all descendants
attributes: true, // Watch attribute changes
attributeOldValue: true,
characterData: true // Watch text changes
});
// Stop observing
// observer.disconnect();function waitForElement(selector) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(() => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
}observer.observe(element, {
attributes: true,
attributeFilter: ['class', 'data-status']
});Avoid polling with setInterval
// DON'T DO THIS
setInterval(() => {
if (document.querySelector('.new-element')) {
// Check repeatedly
}
}, 100);✓ Works in all modern browsers (IE11+)