Node Mutation Hook Library

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

Ten skrypt nie powinien być instalowany bezpośrednio. Jest to biblioteka dla innych skyptów do włączenia dyrektywą meta // @require https://update.greasyfork.org/scripts/565361/1757829/Node%20Mutation%20Hook%20Library.js

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

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

// callbacks should return a truthy value when they want no more elements to be processed, and falsy value when they want to continue processing
function hookCreation(selector, callback, callbackOnExisting) {
  const observerTarget = document.documentElement;

  if (callbackOnExisting) {
    for (const element of observerTarget.querySelectorAll(selector)) {
      if (callback(element)) {
        return;
      }
    }
  }

  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)) {
            if (callback(node)) {
              observer.disconnect();
              return;
            }
          }

          for (const element of node.querySelectorAll(selector)) {
            if (callback(element)) {
              observer.disconnect();
              return;
            }
          }
        }
      }
    }
  });

  observer.observe(observerTarget, {
    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
  });
}