Greasy Fork

Beibei.js

IMPORTANT: This function requires your script to have loaded jQuery.

目前为 2023-03-10 提交的版本。查看 最新版本

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

/**
 * @description: 一个实用程序函数,用于 Greasemonkey 脚本, 检测和处理 AJAXed 内容
 * @param {*} selector_txt 元素选择器
 * @param {*} active_host 激活的域名
 * @param {*} active_url 激活的页面URL
 * @param {*} b_wait_once 是否只扫描一次
 * @param {*} iframe_selector 是否扫描Frame框架
 * @param {*} action_function 找到元素时运行的方法,传送 node, selector_txt, active_host, active_url 四个变量
 */
function waitForKeyElements(selector_txt, active_host, active_url, b_wait_once, iframe_selector, js_code, action_function) {
    if (active_host != '*' && document.domain.split('.').slice(-2).join('.') != active_host) return

    var active_url_type = false
    if (typeof active_url == "object") {
        for (let index = 0; index < active_url.length; index++) {
            if (window.location.href.indexOf(active_url[index]) > -1) {
                active_url_type = true
                break
            }
        }
    } else if (typeof active_url == "string") {
        if (window.location.href.indexOf(active_url) > -1) active_url_type = true
    }


    if (active_url_type) {
        var target_nodes, b_targets_found
        if (iframe_selector) {
            target_nodes = $(iframe_selector).contents().find(selector_txt)
        } else {
            target_nodes = $(selector_txt)
        }

        if (target_nodes && target_nodes.length > 0) {
            b_targets_found = true
            target_nodes.each(function () {
                var j_this = $(this)
                var already_found = j_this.data("alreadyFound") || false

                if (!already_found) {
                    logPrint(`selector_txt > ${selector_txt} active_host > ${active_host} active_url > ${active_url} b_wait_once > ${b_wait_once} iframe_selector > ${iframe_selector}`)
                    console.log(j_this);

                    var cancel_found = false
                    if (typeof action_function == "object") {
                        action_function.forEach(element => {
                            cancel_found = element(j_this, selector_txt, active_host, active_url, js_code);
                        })
                    } else if (typeof action_function == "function") {
                        cancel_found = action_function(j_this, selector_txt, active_host, active_url, js_code);
                    }

                    if (cancel_found) {
                        b_targets_found = false
                    } else {
                        j_this.data("alreadyFound", true);
                    }
                }
            })
        } else {
            b_targets_found = false;
        }

        var control_obj = waitForKeyElements.control_obj || {};
        var control_key = selector_txt.replace(/[^\w]/g, "_");
        var time_control = control_obj[control_key];

        if (b_targets_found && b_wait_once && time_control) {
            clearInterval(time_control);
            delete control_obj[control_key];
        } else {
            if (!time_control) {
                time_control = setInterval(function () {
                    waitForKeyElements(selector_txt, active_host, active_url, b_wait_once, iframe_selector, js_code, action_function,);
                }, 300);
                control_obj[control_key] = time_control;
            }
        }
        waitForKeyElements.control_obj = control_obj;
    }
}
function makeGetRequest(url, method = 'GET', data = null) {
    logPrint(`${method} -> ${url}`)
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            url: url,
            method: method,
            data: data,
            onload: function (response) {
                resolve(response);
            },
            onerror: function (error) {
                reject(error);
            }
        });
    });
}
function logPrint(params) {
    var date_time = $.trim(new Date(new Date().setHours(new Date().getHours() + 8)).toISOString().replace("Z", " ").replace("T", " "))
    var function_name = (new Error()).stack.split("\n")[2].trim().split(" ")[1]
    console.log(`[${date_time}][DEBUG] ${function_name} - ${params}`)
}
function sleep(interval) {
    return new Promise(resolve => { setTimeout(resolve, interval) })
}
function loadMenu(menu_ALL) {
    var menu_ID = []

    // 如果读取到的值为 null 就写入默认值
    for (let i = 0; i < menu_ALL.length; i++) {
        if (GM_getValue(menu_ALL[i][0]) == null) { GM_setValue(menu_ALL[i][0], menu_ALL[i][3]) }
    }

    registerMenuCommand()

    // 注册脚本菜单
    function registerMenuCommand() {

        // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单
        if (menu_ID.length > menu_ALL.length) {
            for (let i = 0; i < menu_ID.length; i++) {
                GM_unregisterMenuCommand(menu_ID[i])
            }
        }

        // 循环注册脚本菜单
        for (let i = 0; i < menu_ALL.length; i++) {
            menu_ALL[i][3] = GM_getValue(menu_ALL[i][0])
            menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][3] ? '✅' : '❌'} ${menu_ALL[i][2]}`, function () {
                menu_switch(`${menu_ALL[i][0]}`, `${menu_ALL[i][1]}`, `${menu_ALL[i][2]}`, `${menu_ALL[i][3]}`)
            })
        }

        // 加入版本信息
        menu_ID[menu_ID.length] = GM_registerMenuCommand(`🏁 当前版本 ${GM_info['script']['version']}`, function () {
            window.GM_openInTab(version_url, { active: true, insert: true, setParent: true })
        })
    }

    //切换选项
    function menu_switch(name, ename, cname, value) {
        if (value == 'false') {
            // 重新注册脚本菜单,刷新网页
            GM_setValue(`${name}`, true)
            registerMenuCommand()
            location.reload()
            GM_notification({ text: `「${cname}」已开启\n`, timeout: 3500 })
        } else {
            // 重新注册脚本菜单,刷新网页
            GM_setValue(`${name}`, false)
            registerMenuCommand()
            location.reload()
            GM_notification({ text: `「${cname}」已关闭\n`, timeout: 3500 })
        }
        // 重新注册脚本菜单
        registerMenuCommand()
    }
}
function initializationScript() {
    var $ = window.$
    var VueCDN = "https://lib.baomitu.com/vue/3.2.36/vue.global.prod.min.js"
    var ElementPlusCDN = "https://lib.baomitu.com/element-plus/2.2.2/index.full.min.js"
    GM_addStyle(GM_getResourceText("element-plus"))
    $.getScript(VueCDN, function () {
        console.log("[" + VueCDN + "] Vue 加载成功");
        $.getScript(ElementPlusCDN, function () {
            console.log("[" + ElementPlusCDN + "] ElementPlus 加载成功")
            var ElementPlus = unsafeWindow.ElementPlus;
            var Vue = unsafeWindow.Vue;
        })
    })
}