OsuPageObserver

Detects dynamic osu page changes

当前为 2022-03-06 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/441010/1025087/OsuPageObserver.js

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

class OsuWebObserver {
    constructor(callback) {
        this.callback = callback;
        this.callback("static");
        const pageType = this.getType();
        if (pageType === "dynamic") {
            const firstLoad = new MutationObserver(() => {
                this.callback("dynamic");
                firstLoad.disconnect();
            });
            const layout = document.querySelector(".osu-layout__section")?.firstElementChild;
            if (layout != null) {
                firstLoad.observe(layout, {childList: true});
            }
        }
        this.pageObserver = new MutationObserver(this.detectPageChange);
        this.pageObserver.observe(document.documentElement, {childList: true});
    }
    
    detectPageChange = (mutations) => {
        for (const mutation of mutations) {
            if (mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeName == "BODY") {
                        this.callback("static");
                        this.callback("dynamic");
                        return;
                    }
                });
            }
        }
    }

    getType = () => {
        const type = location.pathname.split("/")[1];
        const dynamic = ["users", "beatmapsets", "scores"];
        if (dynamic.includes(type)) {
            return "dynamic";
        }
        return "static";
    }

    destroy = () => {
        this.pageObserver.disconnect();
    }
}