Greasy Fork

WaitForKeyElement

Waits for an element using the MutationObserver API

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.cloud/scripts/523012/1519437/WaitForKeyElement.js

// ==UserScript==
// @name         WaitForKeyElement
// @namespace    Violentmonkey Scripts
// @version      1.1
// @description  Waits for an element using the MutationObserver API
// @author       PaywallDespiser
// @grant        none
// ==/UserScript==

/**
 * Waits for a element of a given selector.
 *
 * @param {string} selector
 * @param {Element} [target=document.body]
 * @returns {Promise<Element>}
 */
function waitForKeyElement(selector, target = document.body) {
    return new Promise((resolve) => {
        {
            const element = target.querySelector(selector);
            if (element) {
                return resolve(element);
            }
        }

        const observer = new MutationObserver((mutations) => {
            for (const mutation of mutations) {
                for (const node of mutation.addedNodes) {
                    if (!(node instanceof HTMLElement)) continue;

                    if (node.matches(selector)) {
                        observer.disconnect();
                        resolve(node);
                        return;
                    }
                    const childElement = node.querySelector(selector);
                    if (childElement) {
                        observer.disconnect();
                        resolve(childElement);
                        return;
                    }
                }
            }
        });

        observer.observe(target, {
            childList: true,
            subtree: true,
            attributes: false,
            characterData: false,
        });
    });
}