您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Gives a 0.1% chance to delete anything on any page, and remembers deletions across all pages.
当前为
- // ==UserScript==
- // @name 0.1% Chance Total Deletion with Global Persistence
- // @namespace Fists
- // @version 1.3
- // @description Gives a 0.1% chance to delete anything on any page, and remembers deletions across all pages.
- // @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_v3';
- // Load deleted nodes from localStorage
- let deletedNodes = JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
- // Function to generate a unique identifier for nodes
- function getNodeIdentifier(node) {
- if (node.nodeType === Node.ELEMENT_NODE) {
- return `${node.tagName}_${node.id}_${node.className}_${node.name}_${node.innerText.length}`;
- } else if (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE) {
- return `${node.nodeType}_${node.nodeValue.trim().slice(0, 50)}`;
- }
- return '';
- }
- // Function to check if a node has been previously deleted
- function isNodeDeleted(node) {
- const identifier = getNodeIdentifier(node);
- return deletedNodes.includes(identifier);
- }
- // Function to store deleted node identifiers
- function storeDeletedNode(node) {
- const identifier = getNodeIdentifier(node);
- if (!deletedNodes.includes(identifier)) {
- deletedNodes.push(identifier);
- localStorage.setItem(STORAGE_KEY, JSON.stringify(deletedNodes));
- }
- }
- // Function to attempt deletion of any node
- function tryDeleteNode(node) {
- if (Math.random() < 0.001 && !isNodeDeleted(node)) { // 0.1% chance
- if (node.nodeType === Node.ELEMENT_NODE) {
- node.remove();
- console.log('Element deleted:', node);
- } else if (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE) {
- node.remove();
- console.log('Text or comment node deleted:', node);
- }
- storeDeletedNode(node);
- }
- }
- // Observer to watch for new elements, attributes, and nodes being added or modified in the DOM
- const observer = new MutationObserver(mutations => {
- mutations.forEach(mutation => {
- // Try to delete the target node
- mutation.addedNodes.forEach(node => {
- if (!isNodeDeleted(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, text nodes, and comments that are already loaded
- const allNodes = document.querySelectorAll('*');
- allNodes.forEach(element => {
- // Try to delete the element itself
- if (!isNodeDeleted(element)) {
- tryDeleteNode(element);
- }
- // Try to delete text nodes and comments within the element
- element.childNodes.forEach(child => {
- if (!isNodeDeleted(child)) {
- tryDeleteNode(child);
- }
- });
- });
- })();