Greasy Fork

Greasy Fork is available in English.

动态移除复制限制

自动监听新加载的DOM元素,并移除user-select属性

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         动态移除复制限制
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  自动监听新加载的DOM元素,并移除user-select属性
// @author       ChatGPT
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    /**
     * 移除元素及其子元素上的 user-select 属性
     * @param {HTMLElement} element
     */
    function removeUserSelect(element) {
        if (!element) return;

        // 移除当前元素的属性
        element.style.removeProperty('user-select');
        element.style.removeProperty('-webkit-user-select');
        element.style.removeProperty('-moz-user-select');

        // 遍历所有子元素,递归移除属性
        const allChildren = element.querySelectorAll('*');
        allChildren.forEach(child => {
            child.style.removeProperty('user-select');
            child.style.removeProperty('-webkit-user-select');
            child.style.removeProperty('-moz-user-select');
        });
    }

    // 创建一个 MutationObserver 实例
    const observer = new MutationObserver(mutationsList => {
        for(const mutation of mutationsList) {
            // 检查是否有新节点被添加
            if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) { // 确保是元素节点
                        removeUserSelect(node);
                    }
                });
            }
        }
    });

    // 开始观察 body 元素及其所有子元素的变动
    observer.observe(document.body, {
        childList: true, // 观察子节点的添加或移除
        subtree: true    // 观察所有后代节点
    });

    // 为了防止一些在 Observer 启动前就渲染好的元素,
    // 可以在页面加载后手动执行一次
    window.addEventListener('load', () => removeUserSelect(document.body));

})();