您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
用户脚本的基础,包含读取配置的功能;利用此脚本,用户可以忽略配置相关的代码;直接定义功能就可以;
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/404294/810055/Kerwin612.js
- // ==UserScript==
- // @name Kerwin612
- // @version 0.1
- // @author kerwin612
- // @license MIT
- // @include *
- // @run-at document-start
- // @grant GM.getValue
- // @noframes
- // ==/UserScript==
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Kerwin612's UserScript CORE<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- //默认配置信息
- var config = {
- run: (() => {
- //在此配置主方法,读完配置后会执行此方法
- var key = 'default';
- var url = window.location.href;
- for (let [k, v] of Object.entries(fs)) {
- if ((url === k || url.startsWith(k) || new RegExp(k).test(url))) {
- key = k;
- break;
- }
- }
- var obj = fs[key];
- if (!obj) return;
- obj.startup(obj.ctx);
- obj.readyInterval = setInterval((function(){
- if (this.ready(this.ctx)) {
- clearInterval(this.readyInterval);
- this.run(this.ctx);
- }
- }).bind(obj), 30);
- }).bind(this)
- };
- function getConfig(config, keys, index) {
- index = index || 0;
- var key = keys[index++];
- var value = config[key];
- return new Promise((resolve) => {
- GM.getValue(key, value)
- .then((cv) => {
- if (key === 'config') {
- config = Object.assign(config, cv);
- } else {
- config[key] = (typeof config[key]) === 'object' ? Object.assign(config[key], cv) : cv;
- }
- })
- .finally(() => {
- if (index > keys.length - 1) {
- resolve(config);
- } else {
- getConfig(config, keys, index).then((c) => {resolve(c)});
- }
- });
- });
- }
- setTimeout(() => {
- if (GM && GM.getValue) {
- getConfig(config, ['config'].concat(Object.keys(config))).then((c) => {
- Object.assign(config, c).run();
- });
- } else {
- //如果不支持用户配置,就直接用默认配置
- config.run();
- }
- }, 500);
- var fs = {};
- /*
- func(
- () => {}, //启动方法
- () => {}, //判断页面是否准备好
- () => {}, //主方法
- string.., //URL匹配项
- );
- */
- function func() {
- //arguments is an array-like object, but not an array
- var as = arguments;
- if (as.length < 3) return;
- var obj = {};
- obj.startup = as[0].bind(obj);
- obj.ready = as[1].bind(obj);
- obj.run = as[2].bind(obj);
- obj.ctx = {};
- if (as.length === 3) {
- fs['default'] = obj;
- return;
- }
- [].forEach.call(as, function(value, index) {
- if (index < 3) return;
- fs[value||'default'] = obj;
- });
- }
- ////默认配置,如有配置项,将按照以下模板将配置写在>>>>>Kerwin612's UserScript CORE>>>>>以下
- //config.configKey = configVal
- ////方法模板,将此模板copy到>>>>>Kerwin612's UserScript CORE>>>>>以下,可多次
- //func(
- // //startup: url匹配上时就会执行的方法,无须返回值,仅执行一次
- // (ctx) => {
- // },
- // //ready: url匹配上时就会执行的方法,返回bool类型的值,每30ms执行一次,直至此方法返回true后就不再执行
- // (ctx) => {
- // return true;
- // },
- // //run: url匹配上且以上的ready方法返回true后执行的方法,无须返回值,仅执行一次
- // (ctx) => {
- // },
- // //URL匹配项,可定义多个;当URL匹配时才执行上面的方法;当URL为空或未定义时,上述方法为默认执行的方法
- // 'url1','url2','url3'
- //);
- //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Kerwin612's UserScript CORE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>