您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
全平台自动滚动
- // ==UserScript==
- // @name AutoScroll
- // @author Yiero
- // @description 全平台自动滚动
- // @version 1.0.0
- // @namespace https://github.com/AliubYiero/TamperMonkeyScripts
- // @match https://*/*
- // @icon https://*/favicon.ico
- // @license GPL
- // @grant GM_addStyle
- // @grant GM_registerMenuCommand
- // @grant GM_unregisterMenuCommand
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_deleteValue
- // @grant GM_listValues
- // @updateUrl https://raw.githubusercontent.com/AliubYiero/TamperMonkeyScripts/master/dist/AutoScroll.js
- // @downloadUrl https://raw.githubusercontent.com/AliubYiero/TamperMonkeyScripts/master/dist/AutoScroll.js
- // ==/UserScript==
- var __defProp = Object.defineProperty;
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
- var __publicField = (obj, key, value) => {
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
- return value;
- };
- const registerMenu = (title, callback) => {
- return GM_registerMenuCommand(title, function() {
- callback();
- });
- };
- const unregisterMenu = (menuId) => {
- GM_unregisterMenuCommand(menuId);
- };
- const createElement = (elementConfig) => {
- const { tagName, className, id, innerHTML, innerText } = elementConfig;
- const element = document.createElement(tagName);
- if (className && typeof className === "string") {
- element.classList.add(className);
- } else if (className && Array.isArray(className)) {
- element.classList.add(...className);
- }
- if (id) {
- element.id = id;
- }
- if (innerHTML) {
- element.innerHTML = innerHTML;
- }
- if (innerText) {
- element.innerText = innerText;
- }
- for (let elementConfigKey in elementConfig) {
- if (["tagName", "className", "id", "innerHTML", "innerText"].indexOf(elementConfigKey) !== -1) {
- continue;
- }
- element.setAttribute(elementConfigKey, elementConfig[elementConfigKey]);
- }
- return element;
- };
- const addElementToDocument = (element, cssString, fatherElement = document.body) => {
- fatherElement.append(element);
- GM_addStyle(cssString);
- };
- const tupleToObject = (keyArray, valueArray) => {
- return keyArray.reduce((obj, key, index) => {
- obj[key] = valueArray[index];
- return obj;
- }, {});
- };
- class GMStorage {
- constructor(key) {
- __publicField(this, "key");
- this.key = key;
- }
- /** 设置/更新键 */
- static set(key, value) {
- GM_setValue(key, value);
- }
- /** 获取值 */
- static get(key, defaultValue = null) {
- return GM_getValue(key, defaultValue);
- }
- /** 移除键 */
- static remove(key) {
- GM_deleteValue(key);
- }
- /** 设置/更新键 */
- set(value) {
- GM_setValue(this.key, value);
- }
- /** 批量设置/更新键 */
- setList(keyValueObject) {
- for (let key in keyValueObject) {
- const value = keyValueObject[key];
- GMStorage.set(key, value);
- }
- }
- /** 获取值 */
- get(defaultValue = null) {
- return GM_getValue(this.key, defaultValue);
- }
- /** 批量获取值 */
- getList(keys, defaultValue = null) {
- const values = [];
- keys.forEach((key) => {
- values.push(GMStorage.get(key, defaultValue));
- });
- return values;
- }
- /** 移除键 */
- remove() {
- GM_deleteValue(this.key);
- }
- /**
- * 返回所有键
- * */
- keys() {
- return GM_listValues();
- }
- /** 返回所有值 */
- values() {
- const values = [];
- const keys = this.keys();
- keys.forEach((key) => {
- values.push(GMStorage.get(key));
- });
- return values;
- }
- /** 返回所有键值对对象 */
- getAll() {
- const keys = this.keys();
- const values = this.values();
- return tupleToObject(keys, values);
- }
- /** 清除所有储存 */
- clear() {
- const keys = this.keys();
- keys.forEach((key) => {
- GMStorage.remove(key);
- });
- }
- }
- class Prompt {
- constructor(title, confirmCallback, mountedCallback = () => {
- }) {
- __publicField(this, "title");
- __publicField(this, "confirmCallback");
- __publicField(this, "mountedCallback");
- __publicField(this, "promptElement");
- this.title = title;
- this.confirmCallback = confirmCallback;
- this.mountedCallback = mountedCallback;
- this.createElement();
- }
- // 隐藏
- hide() {
- document.querySelector(".custom-prompt__container").classList.add("hide");
- }
- // 展示元素
- show() {
- document.querySelector(".custom-prompt__container").classList.remove("hide");
- }
- createElement() {
- this.promptElement = createElement({
- tagName: "section",
- className: ["custom-prompt__container", "hide"],
- innerHTML: `
- <header>
- <h3 class="custom-prompt__title">${this.title}</h3>
- </header>
- <main>
- <input class="custom-prompt__input" type="text">
- </main>
- <footer class="custom-prompt__confirm-btn">
- <button>确认</button>
- <button>取消</button>
- </footer>
- `
- });
- const cssString = `
- .custom-prompt__container{width:400px;height:125px;background:#f8f8f8;border-radius:15px;box-sizing:border-box;padding:20px;box-shadow:2px 2px #a6a6a6;display:flex;justify-content:center;flex-flow:column;position:fixed;top:10px;left:50%;transform:translateX(-50%);z-index:10002}h3.custom-prompt__title{margin:10px -0px}input.custom-prompt__input{width:360px;border:#a6a6a6 2px solid;border-radius:5px;box-sizing:border-box;padding:5px 10px}.custom-prompt__confirm-btn{margin-top:10px;align-self:flex-end}.custom-prompt__confirm-btn>button{padding:3px;border-radius:5px;border:2px #a6a6a6 solid}.custom-prompt__confirm-btn>button:hover{border:2px cornflowerblue solid;color:cornflowerblue}.custom-prompt__container.hide{display:none}
- `;
- const htmlElements = {
- confirmBtn: this.promptElement.querySelector(".custom-prompt__confirm-btn > button:first-of-type"),
- cancelBtn: this.promptElement.querySelector(".custom-prompt__confirm-btn > button:last-of-type"),
- userInputContainer: this.promptElement.querySelector(".custom-prompt__input")
- };
- this.mountedCallback(this.promptElement);
- htmlElements.confirmBtn.addEventListener("click", () => {
- this.confirmCallback(htmlElements.userInputContainer.value, this.promptElement);
- this.hide();
- });
- htmlElements.cancelBtn.addEventListener("click", this.hide);
- document.addEventListener("click", (e) => {
- if (this.promptElement && !this.promptElement.contains(e.target)) {
- this.hide();
- }
- });
- addElementToDocument(this.promptElement, cssString);
- }
- }
- class Config {
- constructor() {
- }
- // 读取是否滚动(滚动状态)
- get isScroll() {
- return this.isScrollStorage.get(false);
- }
- // 写入是否滚动(滚动状态)
- set isScroll(newScrollStatus) {
- this.isScrollStorage.set(newScrollStatus);
- }
- // 读取滚动速度(一次滚动多少像素)
- get scrollSpeed() {
- return this.scrollSpeedStorage.get(5);
- }
- // 写入滚动速度
- set scrollSpeed(newSpeed) {
- this.scrollSpeedStorage.set(newSpeed);
- }
- // 滚动储存
- get isScrollStorage() {
- return new GMStorage("isScroll");
- }
- // 注册(不可用)滚动速度储存
- get scrollSpeedStorage() {
- return new GMStorage("scrollSpeed");
- }
- }
- const config = new Config();
- class AutoScroll {
- constructor() {
- __publicField(this, "timer");
- }
- open() {
- this.timer = setInterval(() => {
- /* @__PURE__ */ (() => {
- })("滚动", config.scrollSpeed);
- scrollBy({
- top: config.scrollSpeed,
- behavior: "smooth"
- });
- }, 16);
- }
- close() {
- clearInterval(this.timer);
- }
- }
- const autoScroll = new AutoScroll();
- (async () => {
- const prompt = new Prompt("输入滚动速度 (数字越大滚动速度越快) ", (value) => {
- if (isNaN(+value)) {
- return;
- }
- config.scrollSpeed = +value;
- }, (element) => {
- element.value = String(config.scrollSpeed);
- });
- registerMenu("定义滚动速度", () => {
- prompt.show();
- });
- config.isScroll = false;
- openMenu();
- function openMenu() {
- const openMenuId = registerMenu("[自动滚动] 开启", () => {
- autoScroll.open();
- unregisterMenu(openMenuId);
- const closeMenuId = registerMenu("[自动滚动] 关闭", () => {
- autoScroll.close();
- unregisterMenu(closeMenuId);
- openMenu();
- });
- });
- }
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址