Node Mutation Hook Library

A small wrapper around MutationObserver to hook into creation of elements (filtered on CSS selector) or removal of nodes.

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.greasyfork.org/scripts/565361/1755404/Node%20Mutation%20Hook%20Library.js

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        Node Mutation Hook Library
// @namespace   https://greasyfork.org/users/1545341
// @version     2.1.0
// @license     MIT
// @author      abcenjoyer
// @description A small wrapper around MutationObserver to hook into creation of elements (filtered on CSS selector) or removal of nodes.
// ==/UserScript==

function hookCreation(selector, callback) {
  const observer = new MutationObserver((mutations) => {
    for (const record of mutations) {
      for (const node of record.addedNodes) {
        if (node.nodeType === Node.ELEMENT_NODE) {
          if (node.matches(selector)) {
            callback(node, observer);
          }

          for (const element of node.querySelectorAll(selector)) {
            callback(element, observer);
          }
        }
      }
    }
  });

  observer.observe(document.documentElement, {
    childList: true,
    subtree: true
  });
}

function hookRemoval(targetNode, callback) {
  const observer = new MutationObserver((mutations) => {
    for (const record of mutations) {
      for (const node of record.removedNodes) {
          if (node.contains(targetNode)) {
            observer.disconnect();
            callback();
          }
      }
    }
  });

  // observing the entire document is required because if targetNode is deleted because an ancestor node was, observing the parent won't work
  observer.observe(document, {
    childList: true,
    subtree: true
  });
}