Greasy Fork is available in English.
MutationObserver wrapper to wait for the specified CSS selector
Stan na
Ten skrypt nie powinien być instalowany bezpośrednio. Jest to biblioteka dla innych skyptów do włączenia dyrektywą meta // @require https://update.greatest.deepsurf.us/scripts/12228/174269/setMutationHandler.js
/* EXAMPLE:
setMutationHandler(document, '.container p.some-child', function(nodes) {
// single node:
nodes[0].remove();
// or multiple nodes:
nodes.forEach(node => node.style.display = 'none');
// disconnect the observer, this is useful for one-time jobs
return false;
});
*/
// ==UserScript==
// @name setMutationHandler
// @description MutationObserver wrapper to wait for the specified CSS selector
// @namespace wOxxOm.scripts
// @author wOxxOm
// @grant none
// @version 2.1.0
// ==/UserScript==
function setMutationHandler(baseNode, selector, cb, options) {
baseNode = baseNode || document;
var ob;
if (/^#[\w\d-]+$/.test(selector)) {
selector = selector.substr(1);
ob = new MutationObserver(MOhandlerForId);
} else {
ob = new MutationObserver(MOhandler);
}
ob.observe(baseNode, options || {subtree:true, childList:true});
return ob;
function MOhandler(mutations, observer) {
if (mutations.length > 100 && !document.querySelector(selector))
return;
var found = [];
for (var i=0, m; (m = mutations[i++]); ) {
switch (m.type) {
case 'childList':
var nodes = m.addedNodes, nl = nodes.length;
var textNodesOnly = true;
for (var j=0; j < nl; j++) {
var n = nodes[j];
textNodesOnly &= n.nodeType == 3; // TEXT_NODE
if (n.nodeType != 1) // ELEMENT_NODE
continue;
if (n.matches(selector))
found.push(n);
else if (n.querySelector(selector)) {
n = n.querySelectorAll(selector);
if (n.length < 1000)
found.push.apply(found, n);
else
found = found.concat(found.slice.call(n));
}
}
if (textNodesOnly && m.target.matches(selector))
found.push(m.target);
break;
case 'attributes':
if (m.target.matches(selector))
found.push(m.target);
break;
case 'characterData':
if (m.target.parentNode && m.target.parentNode.matches(selector))
found.push(m.target.parentNode);
break;
}
}
if (!found.length)
return;
if (cb.call(ob, found) === false)
ob.disconnect();
}
function MOhandlerForId(mutations, observer) {
var el = document.getElementById(selector);
if (!el || !baseNode.contains(el))
return;
if (cb.call(ob, [el]) === false)
ob.disconnect();
}
}