Yinr-libs

Useful functions for yinr

Versão de: 24/01/2023. Veja: a última versão.

Este script não deve ser instalado diretamente. Este script é uma biblioteca de outros scripts para incluir com o diretório meta // @require https://update.greasyfork.org/scripts/458769/1141560/Yinr-libs.js

// ==UserScript==
// @name               Yinr-libs
// @namespace          https://yinr.cc/
// @version            0.0.1
// @description        Useful functions for yinr
// @author             Yinr
// @license            GPL-v3
// ==/UserScript==

/** YinrLibs */
const YinrLibs = {
    /** 创建 DOM 监听
     * @param {Object} option
     * @param {(Element | string)} option.parentNode MutationObserver 绑定的 DOM 对象
     * @param {string} option.selector 需要监听变化的 selector
     * @param {voidCallback} [option.failCallback=callback] selector 不存在时执行的回调函数
     * @param {MutationCallback} [option.successCallback=null] selector 对象发生 Mutation 事件时执行的回调函数
     * @param {boolean} [option.stopWhenSuccess=true] 执行一次 `successCallback` 后立即解除监听
     * @param {MutationObserverInit} [option.config={childList: true, subtree: true}] MutationObserver 配置参数
     */
    launchObserver ({
        parentNode,
        selector,
        failCallback = null,
        successCallback = null,
        stopWhenSuccess = true,
        config = { childList: true, subtree: true }
    }) {
        if (!parentNode) return
        /** @type {MutationCallback} */
        const observeFunc = mutationList => {
            if (!document.querySelector(selector)) {
                if (failCallback) failCallback()
                return
            }
            if (stopWhenSuccess) observer.disconnect()

            mutationList.itemFilter = (fn, type = 'addedNodes') => mutationList.map(i => Array.from(i[type]).filter(fn)).reduce((arr, val) => arr.concat(val), [])

            if (successCallback) successCallback(mutationList)
        }
        const observer = new MutationObserver(observeFunc)
        observer.observe(parentNode, config)
    }
};