您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Force-enable copy, paste, text selection, and right-click on blocked websites.
// ==UserScript== // @name Copy/Paste Unblocker Ultra // @namespace boss.tools // @version 1.6 // @description Force-enable copy, paste, text selection, and right-click on blocked websites. // @author Boss // @match *://*/* // @run-at document-start // @grant GM_setClipboard // @noframes // ==/UserScript== (function () { 'use strict'; const css = ` html, body, * { -webkit-user-select: text !important; -moz-user-select: text !important; user-select: text !important; } [unselectable="on"] { -webkit-user-select: text !important; user-select: text !important; } input, textarea { -webkit-user-select: auto !important; user-select: auto !important; } `; const styleTag = document.createElement('style'); styleTag.id = 'cp-unblocker-style'; styleTag.textContent = css; (document.documentElement || document.head || document.body).appendChild(styleTag); const killTypes = [ 'copy','cut','paste', 'contextmenu','selectstart','dragstart', 'mousedown','mouseup','click', 'keydown','keypress','keyup', 'pointerdown','pointerup','touchstart','touchend', 'beforecopy','beforecut','beforepaste' ]; const kill = (e) => { e.stopImmediatePropagation(); }; killTypes.forEach(t => { document.addEventListener(t, kill, true); window.addEventListener(t, kill, true); }); const nullifyHandlers = () => { const targets = [document, document.documentElement, document.body].filter(Boolean); const attrs = [ 'oncopy','oncut','onpaste','oncontextmenu','onselectstart','ondragstart', 'onmousedown','onmouseup','onclick','onkeydown','onkeypress','onkeyup','ontouchstart','ontouchend' ]; targets.forEach(t => attrs.forEach(a => { try { t[a] = null; } catch(_) {} })); }; const nullifyInterval = setInterval(nullifyHandlers, 500); window.addEventListener('load', () => { nullifyHandlers(); clearInterval(nullifyInterval); }); const mo = new MutationObserver(records => { for (const m of records) { if (m.type === 'attributes') { const el = m.target; if (m.attributeName.startsWith('on')) { try { el[m.attributeName] = null; } catch(_) {} } if (m.attributeName === 'style' || m.attributeName === 'class') { const cs = getComputedStyle(el); if (cs.userSelect === 'none') { el.style.setProperty('user-select', 'text', 'important'); el.style.setProperty('-webkit-user-select', 'text', 'important'); } } } } }); mo.observe(document.documentElement, { attributes: true, subtree: true }); function forceUnlock() { const vw = window.innerWidth, vh = window.innerHeight; const areaMin = 0.9 * vw * vh; const nodes = Array.from(document.querySelectorAll('body *')); nodes.forEach(el => { const s = getComputedStyle(el); const z = parseInt(s.zIndex) || 0; if (!['fixed','sticky'].includes(s.position) || z < 999) return; const r = el.getBoundingClientRect(); const area = r.width * r.height; const covers = r.left <= 0 && r.top <= 0 && r.right >= vw - 1 && r.bottom >= vh - 1 && area >= areaMin; if (covers) { el.remove(); } }); ['overflow','overflow-y','overflow-x'].forEach(prop => { document.documentElement.style.setProperty(prop, 'auto', 'important'); if (document.body) document.body.style.setProperty(prop, 'auto', 'important'); }); } document.addEventListener('keydown', e => { if (e.altKey && e.shiftKey && e.code === 'KeyU') { e.stopImmediatePropagation(); forceUnlock(); } }, true); document.addEventListener('copy', () => { try { const sel = String(window.getSelection && window.getSelection()); if (sel) GM_setClipboard(sel); } catch(_) {} }, true); })();