diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 286394cb2..309323e24 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -665,7 +665,10 @@ if ( selector === '' || selector === '{{2}}' ) { selector = `[${tokens.join('],[')}]`; } - const rmattr = function() { + let behavior = '{{3}}'; + let timer; + const rmattr = ( ) => { + timer = undefined; try { const nodes = document.querySelectorAll(selector); for ( const node of nodes ) { @@ -676,10 +679,39 @@ } catch(ex) { } }; - if ( document.readyState === 'loading' ) { - window.addEventListener('DOMContentLoaded', rmattr, { once: true }); - } else { + const mutationHandler = mutations => { + if ( timer !== undefined ) { return; } + let skip = true; + for ( let i = 0; i < mutations.length && skip; i++ ) { + const { type, addedNodes, removedNodes } = mutations[i]; + if ( type === 'attributes' ) { skip = false; } + for ( let j = 0; j < addedNodes.length && skip; j++ ) { + if ( addedNodes[j].nodeType === 1 ) { skip = false; break; } + } + for ( let j = 0; j < removedNodes.length && skip; j++ ) { + if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } + } + } + if ( skip ) { return; } + timer = self.requestIdleCallback(rmattr, { timeout: 67 }); + }; + const start = ( ) => { rmattr(); + if ( /\bstay\b/.test(behavior) === false ) { return; } + const observer = new MutationObserver(mutationHandler); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: tokens, + childList: true, + subtree: true, + }); + }; + if ( document.readyState !== 'complete' && /\bcomplete\b/.test(behavior) ) { + document.addEventListener('load', start, { once: true }); + } else if ( document.readyState === 'loading' ) { + document.addEventListener('DOMContentLoaded', start, { once: true }); + } else { + start(); } })();