Greasy Fork镜像 还支持 简体中文。

AO3: Userscript Menu

Centralized menu system for AO3 userscripts

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/547682/1651232/AO3%3A%20Userscript%20Menu.js

// ==UserScript==
// @name         AO3: Userscript Menu Library
// @namespace    https://github.com/ao3-userscripts
// @version      3.0
// @description  Library for AO3 userscripts to register menu items in a unified menu. Use @require to include in your scripts.
// @author       Wolfbatcat
// ==/UserScript==

// Exposes window.AO3UserScriptMenu with a simple register API
(function() {
    if (window.AO3UserScriptMenu) return;

    const menuItems = [];

    function createMenu() {
        const nav = document.querySelector('ul.primary') ||
                    document.querySelector('nav.primary') ||
                    document.querySelector('#dashboard ul.actions');
        if (!nav) return;

        let container = document.getElementById('ao3-userscript-menu');
        if (!container) {
            container = document.createElement('li');
            container.className = 'dropdown';
            container.id = 'ao3-userscript-menu';

            const title = document.createElement('a');
            title.href = '#';
            title.textContent = 'Userscripts';
            container.appendChild(title);

            const menu = document.createElement('ul');
            menu.className = 'menu dropdown-menu';
            container.appendChild(menu);

            // Insert into navigation
            const searchItem = nav.querySelector('li.search');
            if (searchItem) {
                nav.insertBefore(container, searchItem);
            } else {
                nav.appendChild(container);
            }
        }

        renderMenu();
    }

    function renderMenu() {
        const menu = document.querySelector('#ao3-userscript-menu ul.menu');
        if (!menu) return;
        menu.innerHTML = '';
        menuItems.forEach(item => {
            const li = document.createElement('li');
            const a = document.createElement('a');
            a.href = '#';
            a.textContent = item.label;
            a.addEventListener('click', e => {
                e.preventDefault();
                item.onClick();
            });
            li.appendChild(a);
            menu.appendChild(li);
        });
    }

    window.AO3UserScriptMenu = {
        register: function(item) {
            if (!item || typeof item.label !== 'string' || typeof item.onClick !== 'function') return;
            menuItems.push(item);
            if (!document.getElementById('ao3-userscript-menu')) {
                if (document.readyState === 'loading') {
                    document.addEventListener('DOMContentLoaded', createMenu);
                } else {
                    createMenu();
                }
            } else {
                renderMenu();
            }
        }
    };
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址