您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Core library to handle webpages dom with userscripts from document-start
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/476017/1255617/userscripts-core-library.js
// ==UserScript== // @name userscripts-core-library // @version 0.1.0 // @author lucianjp // @description Core library to handle webpages dom with userscripts from document-start // ==/UserScript== const core = { ready: (callback) => document.readyState !== "loading" ? callback() : document.addEventListener("DOMContentLoaded", callback), addStyle: (aCss) => { let head = document.getElementsByTagName("head")[0]; if (!head) { console.error("Head element not found. Cannot add style."); return null; } let style = document.createElement("style"); style.setAttribute("type", "text/css"); style.textContent = aCss; head.appendChild(style); return style; }, observe: (observableCollection, continuous = false) => { const observables = Array.from(observableCollection.entries()).filter( ([_, observable]) => !observable.currentValue ); const observer = new MutationObserver(function (mutations) { for (var i = mutations.length - 1; i >= 0; i--) { const mutation = mutations[i]; const addedNodesLength = mutation.addedNodes.length; if (addedNodesLength > 0) { for (var j = addedNodesLength - 1; j >= 0; j--) { const $node = mutation.addedNodes[j]; if ($node && $node.nodeType === 1) { let observablesLength = observables.length; for (let k = observablesLength - 1; k >= 0; k--) { const [_, observable] = observables[k]; if (observable.test($node)) { observable.set($node); const last = observables.pop(); if (k < observablesLength - 1) observables[k] = last; observablesLength = observablesLength - 1; break; } } } } if (observables.length === 0 && !continuous) { observer.disconnect(); return; } } } }); observer.observe(document, { childList: true, subtree: true }); if (!continuous) core.ready(() => observer.disconnect()); return observer; }, }; class Observable { constructor(lookup, test) { this.value = undefined; this.callbacks = []; this.lookup = lookup; this.test = test; if (typeof lookup === "function") { this.value = lookup(); } } set(newValue) { this.value = newValue; this.executeCallbacks(this.value); } then(callback) { if (typeof callback === "function") { this.callbacks.push(callback); if (this.value) callback(this.value); } return this; } executeCallbacks(value) { this.callbacks.forEach((callback) => callback(value)); } get currentValue() { return this.value; } } class ObservableCollection extends Map { constructor() { super(); } add(name, observable) { this.set(name, observable); return observable; } }