Remove Restrictions and Restore Default Behavior

Allows you select, cut, copy, paste, save and open the DevTools on any website.

目前為 2024-05-07 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Remove Restrictions and Restore Default Behavior
  3. // @name:zh-CN 解除网页限制,恢复默认行为
  4. // @name:en-US Remove Restrictions and Restore Default Behavior
  5. // @namespace http://hl-bo.github.io/namespaces/user-script/remove-limits
  6. // @source https://github.com/HL-Bo/user-script
  7. // @supportURL https://github.com/HL-Bo/user-script/issues
  8. // @version 2.4
  9. // @license AGPLv3
  10. // @description Allows you select, cut, copy, paste, save and open the DevTools on any website.
  11. // @description:zh-CN 恢复选择、剪切、复制、粘贴、保存、右键菜单和打开开发者工具的默认行为。
  12. // @description:en-US Allows you select, cut, copy, paste, save and open the DevTools on any website.
  13. // @author HL-Bo
  14. // @match *://*/**
  15. // @exclude *://vscode.dev
  16. // @exclude *://vscode.dev/**
  17. // @exclude *://*.github.dev
  18. // @exclude *://*.github.dev/**
  19. // @exclude *://github.com/*/*/edit/**
  20. // @exclude *://gitee.com/*/*/edit/**
  21. // @exclude *://codeberg.org/*/*/_edit/**
  22. // @exclude *://www.figma.com/file/**
  23. // @exclude *://www.notion.so/**
  24. // @exclude *://outlook.live.com/**
  25. // @exclude *://mail.netease.com/**
  26. // @exclude *://mail.163.com/**
  27. // @exclude *://mail.126.com/**
  28. // @exclude *://www.yeah.net/**
  29. // @exclude *://mail.qq.com/**
  30. // @exclude *://uutool.cn/*
  31. // @exclude *://anytexteditor.com/*/online-notepad
  32. // @exclude *://*.zhihuishu.com/**
  33. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAspJREFUWEfVl89PE1EQx7/TdpcabKFAoEKQH22ktEYSqRevXiRijEr8cSDe/DNM9D/xhPFn4oF4MeBZuJi0SiiQikTjD2gLCLS7jNmFLt2mu/uWYtB36G73zWQ+b2bevDeEijE5Od/Q3ut5CNA9gMOVc3bvG7+3MLeYRU9nhxqP9r2WURoPh8ObIvpUKTSbzkww6I6IYqWMAdAVxmCkF8z8zk/KFREIA2BmbilGu7tpZpigRGCqATQdAk3LKI46QRjGZtOZ6wx6KWKwWqYWgCbDzNN+UmwhDID3HxduEuP5UQKIQPx1gDJEnpTRoRqJaQnw/dcqVvPrANf2iST50N/dCSKCVQjMmjyVg3K1GsISILvyFT/X8pYRkXw+nD3TD4/HIwigp+ZUDkUThG0I9MVbeIAq9srW9g7SmSW0t4ZwPjHglEZvf3xZGkkmk6W93bI/qpNQUVVs7xRtPOBFgyzr88yM1PwidoolRE53oS3UbAuhMo8Mx/re2ALMZ5dRWLcuZlrsh2JReL1e3ZiWB5nsMlR118kDII/39v2xy09tAQobm8jrALVjIEsSOtpaTMZKioLVXAHaU/OK1fAAt65duvjMFsBxGXUIMGHswmDkhS2AtpK1wnodZg5UQ8EAWpqDxgchgIXPK8gdEUBzMKAnZ3kIAWgxLCmq9T4U9g1B8nn1gvV/ARx7CI49CYVDfAhBoSR0KkTidglNgUYETza6S0KtrO5VwvqHBhDt6XYH4HQYucHyN8jw7Z8Z+uElUgl1QePHjbkqWao4cvenhACcLiRukNpCTejpOuUuBE5XMmEAAlqaAmhvPTg5hTwgbOAQgv8mQD2NiVsnEPjGcDz6ynQfmPkwFyPJd6jWzA0AEZhLSjx5buCTCUD7M5temGDAdXPqCgB4MhyP3C3rmBrRVColb5H/kdv2XAyAvgH8+ARvP0gkEsZ1+w+ixcUwoQ+80AAAAABJRU5ErkJggg==
  34. // @grant none
  35. // @run-at document-start
  36. // ==/UserScript==
  37.  
  38. (function () {
  39. 'use strict';
  40. let in_frame = false;
  41. if (window.frameElement && window.frameElement.tagName === 'IFRAME' || window !== window.top) {
  42. in_frame = true;
  43. }
  44. if (!in_frame) {
  45. console.log(
  46. " ____ _ _ _ _ \n" +
  47. " | _ \\ ___ _ __ ___ ___ __ __ ___ | | (_) _ __ ___ (_) | |_ ___ \n" +
  48. " | |_) | / _ \\ | '_ ` _ \\ / _ \\ \\ \\ / / / _ \\ | | | | | '_ ` _ \\ | | | __| / __|\n" +
  49. " | _ < | __/ | | | | | | | (_) | \\ V / | __/ | |___ | | | | | | | | | | | |_ \\__ \\\n" +
  50. " |_| \\_\\ \\___| |_| |_| |_| \\___/ \\_/ \\___| |_____| |_| |_| |_| |_| |_| \\__| |___/\n" +
  51. " \n" +
  52. " By HL-Bo"
  53. );
  54. }
  55. if (in_frame) {
  56. console.debug('Start the installation of user-script/remove-limits (IN-FRAME)');
  57. } else {
  58. console.info('Start the installation of user-script/remove-limits');
  59. }
  60.  
  61. // 尝试禁用 debugger
  62. // 仅在 eval('debugger') 或 setInterval('debugger', sec) 构造前执行才能阻止
  63. try {
  64. Function.prototype.__constructor_back = Function.prototype.constructor;
  65. Function.prototype.constructor = function () {
  66. if (arguments && typeof arguments[0] === 'string') {
  67. if ('debugger' === arguments[0]) {
  68. console.debug('Disable an function which may execute debugger');
  69. return;
  70. }
  71. }
  72. return Function.prototype.__constructor_back.apply(this, arguments);
  73. };
  74. } catch (error) { console.warn(error); } finally { }
  75.  
  76. let logError = function (error) {
  77. let error_message = error.toString();
  78. if (document && document.body) {
  79. if (document.body.$rl_errors) {
  80. if (!document.body.$rl_errors.includes(error_message)) {
  81. if (in_frame) { console.debug(error_message); } else { console.warn(error_message); }
  82. document.body.$rl_errors.push(error_message);
  83. }
  84. } else { document.body.$rl_errors = new Array(); }
  85. }
  86. };
  87. let executeWithInterval = function (func, delay) {
  88. setTimeout(func, 0); // 异步执行,防止阻塞
  89. setInterval(func, delay);
  90. };
  91. let setEventListener = function (element, event_name, listener) {
  92. if (element.$rl_events) {
  93. if (element.$rl_events.has(event_name)) {
  94. element.removeEventListener(event_name, element.$rl_events.get(event_name));
  95. }
  96. } else {
  97. element.$rl_events = new Map();
  98. }
  99. element.$rl_events.set(event_name, listener);
  100. element.addEventListener(event_name, listener);
  101. };
  102. let copyEvent = function (old_event) {
  103. let new_event_init_dict = new Map();
  104. new_event_init_dict.set("cancelable", false);
  105. if (old_event.bubbles) { new_event_init_dict.set("bubbles", old_event.bubbles); } // Event
  106. if (old_event.composed) { new_event_init_dict.set("composed", old_event.composed); } // Event
  107. if (old_event.detail) { new_event_init_dict.set("detail", old_event.detail); } // UIEvent
  108. if (old_event.view) { new_event_init_dict.set("view", old_event.view); } // UIEvent
  109. if (old_event.sourceCapabilities) { new_event_init_dict.set("sourceCapabilities", old_event.sourceCapabilities); } // UIEvent
  110. if (old_event.relatedTarget) { new_event_init_dict.set("relatedTarget", old_event.relatedTarget); } // FocusEvent
  111. if (old_event.screenX) { new_event_init_dict.set("screenX", old_event.screenX); } // MouseEvent
  112. if (old_event.screenY) { new_event_init_dict.set("screenY", old_event.screenY); } // MouseEvent
  113. if (old_event.clientX) { new_event_init_dict.set("clientX", old_event.clientX); } // MouseEvent
  114. if (old_event.clientY) { new_event_init_dict.set("screenX", old_event.clientY); } // MouseEvent
  115. if (old_event.key) { new_event_init_dict.set("key", old_event.key); } // KeyboardEvent
  116. if (old_event.code) { new_event_init_dict.set("code", old_event.code); } // KeyboardEvent
  117. if (old_event.location) { new_event_init_dict.set("location", old_event.location); } // KeyboardEvent
  118. if (old_event.touches) { new_event_init_dict.set("touches", old_event.touches); } // TouchEvent
  119. if (old_event.targetTouches) { new_event_init_dict.set("targetTouches", old_event.targetTouches); } // TouchEvent
  120. if (old_event.changedTouches) { new_event_init_dict.set("changedTouches", old_event.changedTouches); } // TouchEvent
  121. if (old_event.ctrlKey) { new_event_init_dict.set("ctrlKey", old_event.ctrlKey); } // MouseEvent & KeyboardEvent & TouchEvent
  122. if (old_event.shiftKey) { new_event_init_dict.set("shiftKey", old_event.shiftKey); } // MouseEvent & KeyboardEvent & TouchEvent
  123. if (old_event.altKey) { new_event_init_dict.set("altKey", old_event.altKey); } // MouseEvent & KeyboardEvent & TouchEvent
  124. if (old_event.metaKey) { new_event_init_dict.set("metaKey", old_event.metaKey); } // MouseEvent & KeyboardEvent & TouchEvent
  125. if (old_event.repeat) { new_event_init_dict.set("repeat", old_event.repeat); } // KeyboardEvent
  126. if (old_event.isComposing) { new_event_init_dict.set("isComposing", old_event.isComposing); } // KeyboardEvent
  127. if (old_event.charCode) { new_event_init_dict.set("charCode", old_event.charCode); } // KeyboardEvent
  128. if (old_event.keyCode) { new_event_init_dict.set("keyCode", old_event.keyCode); } // KeyboardEvent
  129. if (old_event.which) { new_event_init_dict.set("which", old_event.which); } // KeyboardEvent
  130. if (old_event.button) { new_event_init_dict.set("button", old_event.button); } // MouseEvent
  131. if (old_event.buttons) { new_event_init_dict.set("buttons", old_event.buttons); } // MouseEvent
  132. if (old_event.relatedTarget) { new_event_init_dict.set("relatedTarget", old_event.relatedTarget); } // MouseEvent
  133. if (old_event.region) { new_event_init_dict.set("region", old_event.region); } // MouseEvent
  134. if (old_event.deltaX) { new_event_init_dict.set("deltaX", old_event.deltaX); } // WheelEvent
  135. if (old_event.deltaY) { new_event_init_dict.set("deltaY", old_event.deltaY); } // WheelEvent
  136. if (old_event.deltaZ) { new_event_init_dict.set("deltaZ", old_event.deltaZ); } // WheelEvent
  137. if (old_event.deltaMode) { new_event_init_dict.set("deltaMode", old_event.deltaMode); } // WheelEvent
  138. if (old_event.pointerId) { new_event_init_dict.set("pointerId", old_event.pointerId); } // PointerEvent
  139. if (old_event.width) { new_event_init_dict.set("width", old_event.width); } // PointerEvent
  140. if (old_event.height) { new_event_init_dict.set("height", old_event.height); } // PointerEvent
  141. if (old_event.pressure) { new_event_init_dict.set("pressure", old_event.pressure); } // PointerEvent
  142. if (old_event.tangentialPressure) { new_event_init_dict.set("tangentialPressure", old_event.tangentialPressure); } // PointerEvent
  143. if (old_event.tiltX) { new_event_init_dict.set("tiltX", old_event.tiltX); } // PointerEvent
  144. if (old_event.tiltY) { new_event_init_dict.set("tiltY", old_event.tiltY); } // PointerEvent
  145. if (old_event.twist) { new_event_init_dict.set("twist", old_event.twist); } // PointerEvent
  146. if (old_event.pointerType) { new_event_init_dict.set("pointerType", old_event.pointerType); } // PointerEvent
  147. if (old_event.isPrimary) { new_event_init_dict.set("isPrimary", old_event.isPrimary); } // PointerEvent
  148. if (old_event.dataTransfer) { new_event_init_dict.set("dataTransfer", old_event.dataTransfer); } // DragEvent
  149. if (old_event.clipboardData) { new_event_init_dict.set("clipboardData", old_event.clipboardData); } // ClipboardEvent
  150. if (old_event.dataType) { new_event_init_dict.set("dataType", old_event.dataType); } // ClipboardEvent
  151. if (old_event.data) { new_event_init_dict.set("data", old_event.data); } // ClipboardEvent
  152. return new Event(old_event.type, new_event_init_dict);
  153. };
  154. let returnEventAllowed = function (event, event_name) {
  155. if (event.defaultPrevented) {
  156. // 如果调用了 Event.preventDefault() ,则重新构建一个不可取消的事件。
  157. let new_event = copyEvent(event);
  158. event.currentTarget.dispatchEvent(new_event);
  159. event = new_event;
  160. }
  161. try {
  162. event.returnValue = true;
  163. } catch (error) { logError(error); } finally { }
  164. if (event_name !== null && event.currentTarget === document) {
  165. console.debug(`Allow ${event_name}`);
  166. }
  167. };
  168. let allowEvent = function (element, event_name) {
  169. setEventListener(element, event_name, function (event) { returnEventAllowed(event, event_name); return true; });
  170. };
  171. let onKeyEvents = function (event) {
  172. let keyCode = event.keyCode || event.which || event.charCode;
  173. let ctrlKey = event.ctrlKey || event.metaKey;
  174. let shiftKey = event.shiftKey;
  175. if (ctrlKey && (keyCode == 65 || keyCode == 88 || keyCode == 67 || keyCode == 86 || keyCode == 83 || keyCode == 85)) {
  176. // Ctrl+A (select-all), Ctrl+X (cut), Ctrl+C (copy), Ctrl+V (paste), Ctrl+S (save), Ctrl+U (view-source)
  177. returnEventAllowed(event, 'hotkey');
  178. } else if (ctrlKey && shiftKey && (keyCode == 73 || keyCode == 74 || keyCode == 67)) {
  179. // Ctrl+Shift+I (devtools), Ctrl+Shift+J (console), Ctrl+Shift+C (elements)
  180. returnEventAllowed(event, 'hotkey (DevTools)');
  181. } else if (keyCode && keyCode == 123) { // F12
  182. returnEventAllowed(event, 'hotkey (F12)');
  183. }
  184. return true;
  185. };
  186. let allowKeyEvents = function (element, event_name) {
  187. setEventListener(element, event_name, onKeyEvents);
  188. };
  189. let preventEventChecks = function (element) {
  190. let all_events = ['onbeforecopy', 'oncopy', 'onbeforecut', 'oncut', 'onbeforepaste', 'onpaste', 'onselectstart', 'oncontextmenu', 'ondragstart', 'ondragenter', 'ondragover', 'ondragleave', 'ondragend', 'ondrop', 'onkeypress', 'onkeydown', 'onkeyup', 'onvisibilitychange', 'onmousedown', 'onmouseup', 'onmousewheel', 'onwheel', 'onmouseenter', 'onmousemove', 'onmouseover', 'onmouseout', 'onmouseleave', 'ongotpointercapture', 'onlostpointercapture', 'onpointerdown', 'onpointerrawupdate', 'onpointerup', 'onpointerenter', 'onpointermove', 'onpointerover', 'onpointerout', 'onpointerleave', 'onpointercancel', 'onfocus', 'onfocusin', 'onfocusout', 'onblur'];
  191. for (let i of all_events) {
  192. Object.defineProperty(element, i,
  193. { get: () => { (event) => false }, set: (value) => { if (value !== null) { console.debug("Prevent to set property") } } }
  194. );
  195. }
  196. };
  197. let allowElement = function (element) {
  198. // 取消通过 JavaScript 实现的禁止复制
  199. try { element.onbeforecopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecopy'); }
  200. try { element.oncopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'copy'); }
  201. // 取消通过 JavaScript 实现的禁止剪切实现的禁止复制
  202. try { element.onbeforecut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecut'); }
  203. try { element.oncut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'cut'); }
  204. // 取消通过 JavaScript 实现的禁止粘贴
  205. try { element.onbeforepaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforepaste'); }
  206. try { element.onpaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'paste'); }
  207. // 取消通过 JavaScript 实现的禁止文字选择
  208. try { element.onselectstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'selectstart'); }
  209. // 取消通过 JavaScript 实现的禁止右键菜单
  210. try { element.oncontextmenu = null; } catch (error) { logError(error); } finally { allowEvent(element, 'contextmenu'); }
  211. // 取消通过 JavaScript 实现的禁止拖动
  212. try { element.ondragstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragstart'); }
  213. try { element.ondragenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragenter'); }
  214. try { element.ondragover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragover'); }
  215. try { element.ondragleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragleave'); }
  216. try { element.ondragend = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragend'); }
  217. // try { element.ondrop = null; } catch (error) { logError(error); } finally { allowEvent(element, 'drop'); }
  218. // 取消通过 CSS 实现的禁止选中
  219. try { element.style.mozUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
  220. try { element.style.webkitUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
  221. try { element.style.msUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
  222. try { element.style.userSelect = 'auto'; } catch (error) { logError(error); } finally { }
  223. // 取消通过 JavaScript 实现的禁用快捷键
  224. try { element.onkeypress = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keypress'); }
  225. try { element.onkeydown = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keydown'); }
  226. try { element.onkeyup = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keyup'); }
  227. // 取消通过 JavaScript 实现的页面离开检测
  228. try { element.onvisibilitychange = null; } catch (error) { logError(error); } finally { allowEvent(element, 'visibilitychange'); }
  229. // 取消通过 JavaScript 实现的鼠标离开检测
  230. // try { element.onmousedown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousedown'); }
  231. // try { element.onmouseup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseup'); }
  232. // try { element.onmousewheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousewheel'); }
  233. // try { element.onwheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'wheel'); }
  234. // try { element.onmouseenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseenter'); }
  235. // try { element.onmousemove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousemove'); }
  236. // try { element.onmouseover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseover'); }
  237. try { element.onmouseout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseout'); }
  238. try { element.onmouseleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseleave'); }
  239. // 取消通过 JavaScript 实现的指针离开检测
  240. // try { element.ongotpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'gotpointercapture'); }
  241. try { element.onlostpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'lostpointercapture'); }
  242. // try { element.onpointerdown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerdown'); }
  243. // try { element.onpointerrawupdate = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerrawupdate'); }
  244. try { element.onpointerup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerup'); }
  245. // try { element.onpointerenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerenter'); }
  246. // try { element.onpointermove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointermove'); }
  247. // try { element.onpointerover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerover'); }
  248. try { element.onpointerout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerout'); }
  249. try { element.onpointerleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerleave'); }
  250. try { element.onpointercancel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointercancel'); }
  251. // 取消通过 JavaScript 实现的焦点离开检测
  252. try { element.onfocus = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focus'); }
  253. try { element.onfocusin = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusin'); }
  254. try { element.onfocusout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusout'); }
  255. try { element.onblur = null; } catch (error) { logError(error); } finally { allowEvent(element, 'blur'); }
  256. // 防止 JavaScript 事件检测
  257. preventEventChecks(element);
  258. };
  259. let allowElementRecursion = function (element) {
  260. allowElement(element);
  261. for (let i of element.children) {
  262. allowElementRecursion(i);
  263. }
  264. };
  265. // let removeAllListeners = function (old_element) {
  266. // let new_element = old_element.cloneNode(true);
  267. // old_element.parentNode.replaceChild(new_element, old_element);
  268. // };
  269. let removeHiddenElements = function (element, recursion) {
  270. if ((element.hidden || element.style.display == 'none' || element.style.visibility == 'hidden' || ((element.style.height <= 0 || element.style.width <= 0) && element.style.overflow == 'hidden') && element.children.length <= 0)) {
  271. console.info(`Remove <${element.tagName} id='${element.id}' class='${element.className}' />`);
  272. element.remove();
  273. } else if (recursion) {
  274. for (let i of element.children) {
  275. removeHiddenElements(i, recursion);
  276. }
  277. }
  278. };
  279. let getMainContainerElement = function () {
  280. // 获取正文节点
  281. let main_container_element = null;
  282. if (document) {
  283. if (main_container_element === null) { // 检查 main 标签
  284. let elements = document.getElementsByTagName('main');
  285. if (elements.length > 0) { main_container_element = elements[0]; }
  286. }
  287. if (main_container_element === null) { // 检查 id='main' 的标签
  288. main_container_element = document.getElementById('main');
  289. }
  290. if (main_container_element === null) { // 检查 id='main-content' 的标签
  291. main_container_element = document.getElementById('main-content');
  292. }
  293. if (main_container_element === null) { // 检查 id='main-contents' 的标签
  294. main_container_element = document.getElementById('main-content');
  295. }
  296. if (main_container_element === null) { // 检查 id='content' 的标签
  297. main_container_element = document.getElementById('content');
  298. }
  299. if (main_container_element === null) { // 检查 id='contents' 的标签
  300. main_container_element = document.getElementById('contents');
  301. }
  302. if (main_container_element === null) { // 检查 class='main' 的标签
  303. let elements = document.getElementsByClassName('main');
  304. if (elements.length > 0) { main_container_element = elements[0]; }
  305. }
  306. if (main_container_element === null) { // 检查 class='main-content' 的标签
  307. let elements = document.getElementsByClassName('content');
  308. if (elements.length > 0) { main_container_element = elements[0]; }
  309. }
  310. if (main_container_element === null) { // 检查 class='main-contents' 的标签
  311. let elements = document.getElementsByClassName('content');
  312. if (elements.length > 0) { main_container_element = elements[0]; }
  313. }
  314. if (main_container_element === null) { // 检查 class='content' 的标签
  315. let elements = document.getElementsByClassName('content');
  316. if (elements.length > 0) { main_container_element = elements[0]; }
  317. }
  318. if (main_container_element === null) { // 检查 class='contents' 的标签
  319. let elements = document.getElementsByClassName('contents');
  320. if (elements.length > 0) { main_container_element = elements[0]; }
  321. }
  322. }
  323. return main_container_element;
  324. };
  325.  
  326. // 对抗延迟运行(即在此脚本执行后运行)的禁用程序和循环执行的禁用程序,
  327. executeWithInterval( // 每 0.2 秒执行一次。
  328. (function () {
  329. if (document) {
  330. try { allowElement(document); } catch (error) { logError(error); } finally { }
  331. }
  332. }), 200
  333. );
  334. executeWithInterval( // 每 0.3 秒执行一次。
  335. (function () {
  336. if (document) {
  337. try { allowElement(document.body); } catch (error) { logError(error); } finally { }
  338. }
  339. }), 300
  340. );
  341. executeWithInterval( // 每 2.0 秒执行一次。
  342. (function () {
  343. let mce = getMainContainerElement();
  344. if (document && mce) {
  345. try { allowElementRecursion(mce); } catch (error) { logError(error); } finally { }
  346. }
  347. }), 2000
  348. );
  349.  
  350. // 对抗延迟运行(即在此脚本执行后运行)的混淆程序和循环执行的混淆程序,
  351. setTimeout(
  352. // 延迟 1.0 秒,有助于动态加载的内容的显示。
  353. function () {
  354. executeWithInterval(
  355. // 每 3.0 秒执行一次。
  356. function () {
  357. if (document) {
  358. // 移除正文中的不可见元素
  359. try {
  360. let mce = getMainContainerElement();
  361. // 移除不可见元素
  362. if (mce) {
  363. removeHiddenElements(mce, true);
  364. }
  365. } catch (error) { logError(error); } finally { }
  366. }
  367. }, 3000
  368. );
  369. }, 1000
  370. );
  371.  
  372. if (in_frame) {
  373. console.debug('Complete the installation of user-script/remove-limits (IN-FRAME)');
  374. } else {
  375. console.info('Complete the installation of user-script/remove-limits');
  376. }
  377. })();