make-mutation-observer

Simple wrapper around `MutationObserver` API to watch DOM changes.

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.greasyfork.org/scripts/488160/1335044/make-mutation-observer.js

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         make-mutation-observer
// @description  Simple wrapper around `MutationObserver` API to watch DOM changes.
// @version      0.1.0
// @namespace    owowed.moe
// @author       owowed <[email protected]>
// @license      LGPL-3.0
// ==/UserScript==

/**
 * @typedef {(info: { records: MutationRecord[], observer: MutationObserver }) => void} MakeMutationObserverCallback
 */

/**
 * @typedef MakeMutationObserverOptionsBasic
 * @prop {HTMLElement} target
 * @prop {MakeMutationObserverCallback} callback
 * @prop {AbortSignal} [abortSignal]
 * @prop {boolean} [once]
 */

/** @typedef {MakeMutationObserverOptionsBasic & MutationObserverInit} MakeMutationObserverOptions */

/**
 * Create a new `MutationObserver` from target and callback.
 * @param {Node} target target node
 * @param {MakeMutationObserverCallback} callback observer callback
 * @param {MakeMutationObserverOptions} options additional observer options
 * @returns {MutationObserver}
 */
function makeMutationObserver(target, callback, options) {
    return makeMutationObserverOptions({ target, ...options }, callback);
}

/**
 * Create a new `MutationObserver` with options and callback.
 * @param {MakeMutationObserverOptions} options 
 * @param {MakeMutationObserverCallback} callback 
 * @returns {MutationObserver}
 */
function makeMutationObserverOptions({ target, abortSignal, once, ...options }, callback) {
   const observer = new MutationObserver(records => {
       abortSignal?.throwIfAborted();
       if (once) observer.disconnect();
       callback({ records, observer });
   });

   observer.observe(target, options);

   abortSignal?.addEventListener("abort", () => {
       observer.disconnect();
   });

   return observer;
}