Greasy Fork is available in English.

iTab主页增强快捷键

增强快捷键,提高使用效率

// ==UserScript==
// @name         iTab主页增强快捷键
// @namespace    https://greasyfork.org/zh-CN/users/1267923-samethink
// @version      1.0
// @description  增强快捷键,提高使用效率
// @author       samethink
// @match        https://go.itab.link/
// @icon         https://go.itab.link/favicon.ico
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_getValue
// @grant        GM_setValue
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    let appArr = [];
    let groupArr = [];
    let activedGroupIndex = -1;
    let appTipsExist = false;
    let groupTipsExist = false;

    function refreshGroupArr() {
        groupArr = document.querySelectorAll(".app-sidebar-ul > .app-group-item");
        groupArr.forEach((item, index) => {
            if (item.classList.contains("active")) {
                activedGroupIndex = index;
                return;
            }
        });
    }

    function clickAndScrollto(element) {
        element.click();
        element.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    document.addEventListener("keydown", event => {
        if (event.altKey) {
            event.preventDefault();
            refreshGroupArr();
            appArr = document.querySelectorAll(".app-icon-item")[activedGroupIndex]?.querySelectorAll(".app-item");

            // 字母键
            if (64 < event.keyCode && event.keyCode < 91 && SETTINGS.ALPHA_MODE.enabled) {
                event.shiftKey ? clickAndScrollto(groupArr[event.keyCode - 56]) : appArr[event.keyCode - 56].firstChild.click();
            }
            // 数字键1~9
            else if (48 < event.keyCode && event.keyCode < 58) {
                event.shiftKey ? clickAndScrollto(groupArr[event.keyCode - 49]) : appArr[event.keyCode - 49].firstChild.click();
            }
            // 数字键0
            else if (event.keyCode === 48) {
                event.shiftKey ? clickAndScrollto(groupArr[groupArr.length - 1]) : appArr[appArr.length - 1].firstChild.click();
            }
            // -/_号
            else if (event.keyCode === 189) {
                event.shiftKey ? undefined : document.querySelector("#menuhomeIcon_3d233b > li:nth-child(4)").click();
            }
            // =/+号
            else if (event.keyCode === 187) {
                event.shiftKey ? document.querySelector("#appGroupAdd").click() : document.querySelector("#menuhome_5dwx > li:nth-child(1)").click();
            }
            // `/~号
            else if (event.keyCode === 192) {
                document.querySelector("#searchInput").click();
            }
            // BackSpace键
            else if (event.keyCode === 8) {
                document.querySelector("#app-main > itab-date").shadowRoot.querySelector("div > div:nth-child(1) > div").click();
            }

            // 添加应用快捷键提示
            else if (event.key === "Alt" && !event.shiftKey && SETTINGS.SHOW_APP_TIPS.enabled && !appTipsExist) {
                appArr.forEach((item, index) => {
                    let title = item.querySelector(".app-item-title");
                    title.textContent = (index < 9 ? `「${index + 1}」` : index < 35 && SETTINGS.ALPHA_MODE.enabled ? `「${String.fromCharCode(index + 56)}」` : "") + title.textContent;
                });
                appTipsExist = true;
            }
            // 添加分组快捷键提示
            else if ((event.key === "Shift" || event.shiftKey) && SETTINGS.SHOW_GROUP_TIPS.enabled && !groupTipsExist) {
                groupArr.forEach((item, index) => {
                    item.querySelector(".app-group-item-title").textContent += " " + (index < 9 ? (index + 1) : index < 35 && SETTINGS.ALPHA_MODE.enabled ? String.fromCharCode(index + 56) : "");
                });
                groupTipsExist = true;
                removeAppTips();
            }
        }
        else if (!document.querySelector("#app-serach-wrap > div > form").className.includes("active")) {
            // 切换上一分组
            if (event.key === "ArrowUp") {
                refreshGroupArr();
                clickAndScrollto(groupArr[(activedGroupIndex === 0 ? groupArr.length : activedGroupIndex) - 1]);
            }
            // 切换下一分组
            else if (event.key === "ArrowDown") {
                refreshGroupArr();
                clickAndScrollto(groupArr[(activedGroupIndex + 1) % groupArr.length]);
            }
        }
    });

    // 添加图标时自动跳到自定义选项
    setTimeout(() => {
        document.querySelector("#menuhome_5dwx > li:nth-child(1)").addEventListener("click", () => {
            setTimeout(() => { document.querySelector("#app-add-icon > ul > li:nth-child(4)").click(); }, 100);
        });
    }, 1000);

    function removeAppTips() {
        if (appTipsExist) {
            for (let i = 0; i < appArr.length && (i < 9 || SETTINGS.ALPHA_MODE.enabled && i < 35); ++i) {
                let title = appArr[i].querySelector(".app-item-title");
                title && (title.textContent = title.textContent.substring(3));
            }
            appTipsExist = false;
        }
    }

    function removeGroupTips() {
        if (groupTipsExist) {
            for (let i = 0; i < groupArr.length && (i < 9 || SETTINGS.ALPHA_MODE.enabled && i < 35); ++i) {
                let title = groupArr[i].querySelector(".app-group-item-title");
                title.textContent = title.textContent.slice(0, -2);
            }
            groupTipsExist = false;
        }
    }

    document.addEventListener("keyup", event => {
        if (event.key === "Alt") removeAppTips();
        else if (event.key === "Shift") removeGroupTips();
    });
    window.onblur = removeAppTips;


    // 设置菜单

    const SETTINGS = {
        SHOW_APP_TIPS: { id: null, name: "应用快捷键提示", enabled: true },
        SHOW_GROUP_TIPS: { id: null, name: "分组快捷键提示", enabled: true },
        ALPHA_MODE: { id: null, name: "使用字母按键", enabled: true },
    };

    function createMenuOptions(init) {
        Object.keys(SETTINGS).forEach(optionKey => {
            const option = SETTINGS[optionKey];
            if (init) {
                let enabled = GM_getValue(optionKey);
                enabled === undefined || (option.enabled = enabled);
            }
            option.id = GM_registerMenuCommand((option.enabled ? "🟢" : "🔴") + option.name, () => {
                const option = SETTINGS[optionKey];
                option.enabled = !option.enabled;
                GM_setValue(optionKey, option.enabled);
                Object.values(SETTINGS).forEach(option => {
                    GM_unregisterMenuCommand(option.id);
                });
                createMenuOptions(false);
            });
        });
    }

    createMenuOptions(true);

})();