// ==UserScript== // @name Aerfaying Explore - 阿儿法营/稽木世界社区优化插件 // @name:zh-TW Aerfaying Explore - 阿兒法營/稽木世界社群優化插件 // @namespace waterblock79.github.io // @version 1.15.0 // @description 提供优化、补丁及小功能提升社区内的探索效率和用户体验 // @description:zh-tw 提供優化、修補程式及小功能提升社群內的探索效率與使用者體驗 // @author waterblock79 // @match http://gitblock.cn/* // @match https://gitblock.cn/* // @match http://aerfaying.com/* // @match https://aerfaying.com/* // @icon https://gitblock.cn/Content/logo.ico // @grant GM_setValue // @grant GM_getValue // @grant unsafeWindow // @license MIT // @downloadURL none // ==/UserScript== /* aerfaying-explore 是一个非官方的、针对阿儿法营/稽木世界社区的开源优化插件 https://github.com/waterblock79/aerfaying-explore */ (function () { 'use strict'; // 初始化信息 try { var window = unsafeWindow || window; } catch (e) { } if (!window) { try { var window = self; } catch (e) { alert('似乎无法在您的浏览器上运行此脚本。') } } const version = '1.15.0'; if (location.search === '?NoUserscript') return; // 判断 GM_setValue、GM_getValue 是否可用(貌似不存在的话,获取就报错,不能像 foo == undefined 那样获取它是否存在) try { if (GM_getValue && GM_setValue) { window.GMAvailable = true; } else { window.GMAvailable = false; } } catch (e) { window.GMAvailable = false; } // $(selector) // 即 document.querySelectorAll(selector) /** * @param {string} selector * @returns {HTMLElement[]} */ const $ = (selector) => document.querySelectorAll(selector); // addSelectorEvent(selector, event, callback) // 为全部符合 selector 选择器的元素自动添加 event 事件,若该事件被触发就会执行 callback 回调 let eventElement = []; const addSelectorEvent = (selector, event, callback) => { if (Array.isArray(event)) { for (let i in event) { addSelectorEvent(selector, event[i], callback); } return; } eventElement.push({ selector: selector, event: event, callback: callback, handledElements: [] }) } window.addSelectorEvent = addSelectorEvent; // addFindElement(selector, callback) // 当选择器发现新的符合 selector 的元素就执行 callback,callback 会传入该元素。 let findElement = []; const addFindElement = (selector, callback) => { findElement.push({ selector: selector, callback: callback, handledElements: [] }) // 此处返回该任务在 findElement 中的 index,方便后续删除该任务。 return findElement.length - 1; }; window.addFindElement = addFindElement; // addHrefChangeEvent(callback) // 当页面 location.href 改变触发该事件 let lastHref = null; let hrefChangeEvent = []; const addHrefChangeEvent = (callback) => { hrefChangeEvent.push({ callback: callback, }); }; // →_→ // 通过 setInterval 实现 addFindElement 和 addSelectorEvent。 setInterval(() => { // addFindElement findElement.forEach((item) => { $(item.selector).forEach((element) => { if (!item.handledElements.find(e => e == element)) { item.handledElements.push(element); (async () => { item.callback(element) })(); } }) }) // addSelectorEvent eventElement.forEach((item) => { $(item.selector).forEach((element) => { if (!item.handledElements.find(e => e == element)) { element.addEventListener(item.event, item.callback); item.handledElements.push(element); } }) }); // addHrefChangeEvent if (lastHref != location.href) { hrefChangeEvent.forEach((item) => { (async () => { item.callback(location.href) })(); }); } lastHref = location.href; }, 16); // addStyle(css) // 将 CSS 塞到