A Universal Script to Re-Enable the Selection and Copying

Enables select, right-click, copy and drag on pages that disable them.

目前为 2021-06-06 提交的版本。查看 最新版本

// ==UserScript==
// @name         A Universal Script to Re-Enable the Selection and Copying
// @version      1.2.5
// @description  Enables select, right-click, copy and drag on pages that disable them.
// @include      /^https?\:\/\//
// @grant        none
// @run-at       document-start
// @namespace https://gf.qytechs.cn/users/371179
// ==/UserScript==
"use strict";
(function() {
    var wasRun = false;

    var cssStyle = '*, body *, div, span, body *::before, body *::after, *:hover, *:link, *:visited, *:active , *[style], *[class]{' +
        '-webkit-touch-callout: text !important; -webkit-user-select: text !important; ' +
        '-khtml-user-select: text !important; -moz-user-select: text !important; ' +
        '-ms-user-select: text !important; user-select: text !important;}';

    function enableSelectClickCopy() {

        var mKey = 'dqzadwpujtct';
        var enabledSCC = '___enabledSCC_' + mKey + '___';
        var nonFalseFunc = '___nff_' + mKey + '___';
        var rvSCC = '___returnValue_' + mKey + '___';

        if (window[enabledSCC]) return;
        window[enabledSCC] = true;

        Event.prototype.preventDefault = (function(f) {
            var eys = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'onbeforecopy'];
            return function() {
                if (eys.indexOf(this.type) >= 0) return;
                return f.apply(this);
            }
        })(Event.prototype.preventDefault);

        var exs = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'onbeforecopy'];
        Object.defineProperty(Event.prototype, "returnValue", {

            get() {
                return rvSCC in this ? this[rvSCC] : true;
            },
            set(newValue) {
                if (exs.indexOf(this.type) < 0 && newValue === false) this.preventDefault();
                this[rvSCC] = newValue;
            },
            enumerable: true,
            configurable: true
        });

        var ezs = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'beforecopy'];
        var eventsCount = ezs.length;

        function universaler(originalFunc) {
            return function wrapFunction(ev) {
                var pName = 'on' + ev.type;
                var func = this[pName];
                if (typeof func == 'function' && func.name == 'wrapFunction') {
                    var res = originalFunc.apply(this, arguments);
                    if (res !== false) {
                        originalFunc[nonFalseFunc] = true;
                        this[pName] = originalFunc;
                        return res;
                    }
                }
            }
        }

        function disableAll(event) {
            var elmNode = event.target
            while (elmNode && elmNode.nodeType > 0) {
                var pName = 'on' + event.type
                var f = elmNode[pName];
                if (f && f[nonFalseFunc] !== true) {
                    var nf = universaler(f);
                    nf[nonFalseFunc] = true;
                    elmNode[pName] = nf;
                }
                elmNode = elmNode.parentNode;
            }
        }


        for (var i = 0; i < eventsCount; i++) {
            var event = ezs[i];
            document.addEventListener(event, disableAll, true);
        }


    }

    function loadedHandler() {
        if (wasRun) return;
        wasRun = true;
        console.log("Select-click-copy Enabler");
        try {
            document.removeEventListener('beforescriptexecute', loadedHandler, true);
            document.removeEventListener('beforeload', loadedHandler, true);
            document.removeEventListener('DOMContentLoaded', loadedHandler, true);
        } catch (e) {}
        appendScript(document);

    }

    function isDocumentObj(x) {
        return x && x.nodeType == 9
    }


    function isHTMLElementObj(x) {
        return x && x.nodeType == 1
    }

    function makeScriptElm(documentObject) {
        if (!isDocumentObj(documentObject)) return null;
        var s = documentObject.createElement('script');
        s.type = 'text/javascript';
        s.innerHTML = '(' + enableSelectClickCopy.toString() + ')()';
        return s
    }

    function appendScript(documentObject) {
        try {
            if (!isDocumentObj(documentObject)) return;
            var container = documentObject.head || documentObject.body;
            if (container) container.appendChild(makeScriptElm(documentObject));
        } catch (e) {}
    }


    function appendCssEnabler(container) {
        if (!isHTMLElementObj(container)) return;
        try {
            var css = document.createElement('style');
            css.type = 'text/css';
            css.innerHTML = cssStyle;
            container.appendChild(css);
        } catch (e) {}
    }

    wasRun = false;

    if (document != null) {

        try {
            enableSelectClickCopy(); //try direct call
        } catch (e) {}

        try {
            if ('onbeforescriptexecute' in document) {
                //for firefox
                document.addEventListener('beforescriptexecute', loadedHandler, true);
            } else {
                //for chrome and opera
                document.addEventListener('beforeload', loadedHandler, true);
            }

        } catch (e) {}

        document.addEventListener('DOMContentLoaded', function() {
            //in case all previous efforts fail
            try {
                loadedHandler();
            } catch (e) {}
            appendCssEnabler(document.documentElement || document.body);
        }, true);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址