您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Gives a 0.1% chance to delete anything on any page, remembers deletions globally using multiple methods, and monitors dynamically loaded elements.
当前为
// ==UserScript== // @name 0.1% Chance Global Element Deletion with Enhanced Persistence // @namespace Fists // @version 1.5 // @description Gives a 0.1% chance to delete anything on any page, remembers deletions globally using multiple methods, and monitors dynamically loaded elements. // @author You // @license CC BY 4.0; https://creativecommons.org/licenses/by/4.0/ // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; const STORAGE_KEY = 'globalDeletedNodes_v4'; // Load deleted nodes from localStorage let deletedNodes = JSON.parse(localStorage.getItem(STORAGE_KEY)) || []; // Function to generate XPath for a node function getXPathForElement(element) { const idx = (sib, name) => sib ? idx(sib.previousElementSibling, name || sib.localName) + (sib.localName == name) : 1; const segs = elm => !elm || elm.nodeType !== 1 ? [''] : elm.id && document.getElementById(elm.id) === elm ? [`id("${elm.id}")`] : [elm.localName.toLowerCase() + (elm.className ? `[@class="${elm.className}"]` : '') + `[${idx(elm)}]`, ...segs(elm.parentNode)]; return segs(element).join('/'); } // Function to generate a selector for a node function getSelectorForElement(element) { if (element.id) { return `#${element.id}`; } if (element.className) { return `.${element.className.split(' ').join('.')}`; } return element.tagName.toLowerCase(); } // Function to generate a robust identifier for a node function getNodeIdentifier(element) { const xpath = getXPathForElement(element); const selector = getSelectorForElement(element); const tagInfo = `${element.tagName}_${element.className}_${element.id}_${element.name}_${element.innerText.length}`; return { xpath, selector, tagInfo }; } // Function to check if a node has been previously deleted function isNodeDeleted(identifiers) { return deletedNodes.some(deleted => deleted.xpath === identifiers.xpath || deleted.selector === identifiers.selector || deleted.tagInfo === identifiers.tagInfo ); } // Function to store deleted node identifiers function storeDeletedNode(identifiers) { if (!isNodeDeleted(identifiers)) { deletedNodes.push(identifiers); localStorage.setItem(STORAGE_KEY, JSON.stringify(deletedNodes)); } } // Function to delete an element by various methods function deleteElement(element, identifiers) { if (element) { element.remove(); storeDeletedNode(identifiers); console.log('Element deleted and stored:', identifiers); } } // Function to apply deletions using stored identifiers function applyStoredDeletions() { deletedNodes.forEach(identifiers => { // Try XPath first const xpathResult = document.evaluate(identifiers.xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); let node = xpathResult.singleNodeValue; // Try CSS Selector if XPath fails if (!node) { node = document.querySelector(identifiers.selector); } // Final fallback: Tag information search if (!node) { const allNodes = document.querySelectorAll('*'); node = [...allNodes].find(el => getNodeIdentifier(el).tagInfo === identifiers.tagInfo); } // Delete the node if found if (node) { deleteElement(node, identifiers); } }); } // Function to attempt deletion of any node function tryDeleteNode(node) { const identifiers = getNodeIdentifier(node); if (Math.random() < 0.001 && !isNodeDeleted(identifiers)) { // 0.1% chance deleteElement(node, identifiers); } } // Observer to watch for new elements, attributes, and nodes being added or modified in the DOM const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) { tryDeleteNode(node); } }); }); }); // Configuration to observe child nodes and text content observer.observe(document.documentElement, { childList: true, subtree: true, characterData: true }); // Initial pass to try deleting elements that are already loaded const allNodes = document.querySelectorAll('*'); allNodes.forEach(element => { tryDeleteNode(element); }); // Apply deletions from stored identifiers applyStoredDeletions(); })();