Greasy Fork

隐藏图片并管理白名单(摸鱼)

仅在白名单中的域名下隐藏图片,并管理白名单功能(通过菜单命令),支持背景图片和延迟加载图片

// ==UserScript==
// @name         隐藏图片并管理白名单(摸鱼)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  仅在白名单中的域名下隐藏图片,并管理白名单功能(通过菜单命令),支持背景图片和延迟加载图片
// @author       lengsukq
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    'use strict';

    // 获取当前域名
    var currentDomain = window.location.hostname;

    // 检查白名单域名
    var whitelistDomains = GM_getValue("whitelistDomains", []);

    // 隐藏图片的通用函数
    function hideImages() {
        console.log("执行图片隐藏操作");

        // 隐藏所有 <img> 标签的图片
        var images = document.querySelectorAll("img");
        images.forEach(function(img) {
            img.style.display = "none";
        });

        // 隐藏所有具有背景图片的元素
        var backgroundImages = document.querySelectorAll('*');
        backgroundImages.forEach(function(element) {
            var bgImage = window.getComputedStyle(element).backgroundImage;
            if (bgImage && bgImage !== 'none') {
                element.style.backgroundImage = 'none';
            }
        });
    }

    // 检查当前域名是否在白名单中
    if (whitelistDomains.includes(currentDomain)) {
        console.log(currentDomain + " 在白名单中,开始隐藏图片");

        // 等待页面加载完成再执行
        window.onload = function() {
            hideImages();  // 初次执行隐藏操作
        };

        // 使用 MutationObserver 动态监视 DOM 的变化(如延迟加载的图片)
        var observer = new MutationObserver(function(mutationsList) {
            for (var mutation of mutationsList) {
                if (mutation.type === 'childList' || mutation.type === 'attributes') {
                    hideImages();  // 检测到变化时再次隐藏图片
                }
            }
        });

        // 配置 MutationObserver 监听所有 DOM 的子节点和属性变化
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: true
        });

    } else {
        console.log(currentDomain + " 不在白名单中,不隐藏图片");
    }

    // 注册菜单命令用于管理白名单
    GM_registerMenuCommand('管理白名单', function() {
        // 创建弹出窗体
        var overlay = document.createElement("div");
        overlay.style.position = "fixed";
        overlay.style.top = "0";
        overlay.style.left = "0";
        overlay.style.width = "100%";
        overlay.style.height = "100%";
        overlay.style.backgroundColor = "rgba(0, 0, 0, 0.6)";
        overlay.style.zIndex = "10001";
        overlay.style.display = "flex";
        overlay.style.alignItems = "center";
        overlay.style.justifyContent = "center";
        document.body.appendChild(overlay);

        var form = document.createElement("div");
        form.style.backgroundColor = "white";
        form.style.padding = "30px";
        form.style.width = "400px";
        form.style.borderRadius = "10px";
        form.style.boxShadow = "0 4px 8px rgba(0, 0, 0, 0.1)";
        form.style.zIndex = "10002";
        overlay.appendChild(form);

        var title = document.createElement("h2");
        title.textContent = "管理白名单";
        title.style.marginTop = "0";
        title.style.fontSize = "20px";
        title.style.textAlign = "center";
        form.appendChild(title);

        var label = document.createElement("label");
        label.textContent = "白名单域名 (每行一个):";
        label.style.fontSize = "14px";
        label.style.display = "block";
        label.style.marginBottom = "10px";
        form.appendChild(label);

        var textarea = document.createElement("textarea");
        textarea.style.display = "block";
        textarea.style.margin = "10px 0";
        textarea.style.width = "100%";
        textarea.style.height = "200px";
        textarea.style.padding = "10px";
        textarea.style.borderRadius = "5px";
        textarea.style.border = "1px solid #ccc";
        textarea.style.fontSize = "14px";
        textarea.value = GM_getValue("whitelistDomains", []).join("\n");
        form.appendChild(textarea);

        // 创建保存按钮
        var saveButton = document.createElement("button");
        saveButton.type = "button";
        saveButton.textContent = "保存";
        saveButton.style.backgroundColor = "#4CAF50";
        saveButton.style.color = "white";
        saveButton.style.border = "none";
        saveButton.style.padding = "10px 20px";
        saveButton.style.borderRadius = "5px";
        saveButton.style.cursor = "pointer";
        saveButton.style.marginRight = "10px";
        form.appendChild(saveButton);

        // 创建取消按钮
        var cancelButton = document.createElement("button");
        cancelButton.type = "button";
        cancelButton.textContent = "取消";
        cancelButton.style.backgroundColor = "#f44336";
        cancelButton.style.color = "white";
        cancelButton.style.border = "none";
        cancelButton.style.padding = "10px 20px";
        cancelButton.style.borderRadius = "5px";
        cancelButton.style.cursor = "pointer";
        form.appendChild(cancelButton);

        // 保存按钮点击事件
        saveButton.addEventListener("click", function() {
            var whitelistDomains = textarea.value.trim().split("\n").filter(Boolean);
            GM_setValue("whitelistDomains", whitelistDomains);
            console.log("白名单已保存: " + whitelistDomains.join(", "));
            // 移除弹出窗体
            document.body.removeChild(overlay);
        });

        // 取消按钮点击事件,关闭窗体但不保存
        cancelButton.addEventListener("click", function() {
            document.body.removeChild(overlay);
        });

        // 点击空白处关闭窗体但不保存
        overlay.addEventListener("click", function(event) {
            if (event.target === overlay) {
                document.body.removeChild(overlay);
            }
        });

        // 防止点击窗体内容时关闭窗体
        form.addEventListener("click", function(event) {
            event.stopPropagation();
        });
    });
})();