您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Debug js using monkey patch
当前为
// ==UserScript== // @name MonkeyDebugger // @namespace https://github.com/JiyuShao/greasyfork-scripts // @version 2024-05-23 // @description Debug js using monkey patch // @author Jiyu Shao <[email protected]> // @license MIT // @match *://*/* // @grant unsafeWindow // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_addValueChangeListener // @require https://update.gf.qytechs.cn/scripts/496315/1384535/QuickMenu.js // ==/UserScript== /* eslint-disable no-eval */ (function () { 'use strict'; // 定义通用的补丁代码给 new Function 与 eval 使用 const patchCode = ` debugger; `; QuickMenu.add({ name: '开启 new Function 调试', type: 'toggle', shouldInitRun: true, shouldAddMenu: () => { return unsafeWindow === unsafeWindow.top; }, callback: (value) => { // 保存原始的 Function 构造器 const originalFunction = Function.originalFunction ? Function.originalFunction : Function; Function.originalFunction = originalFunction; if (value === 'on') { // 定义一个新的 Function 构造器 const patchedFunction = function (...args) { // 在构造的函数代码前插入 debugger 语句 const codeWithDebugger = `${patchCode}; ${args[0]}`; return originalFunction.call( this, codeWithDebugger, ...args.slice(1) ); }; patchedFunction.prototype = originalFunction.prototype; // 替换全局的 Function unsafeWindow.Function = patchedFunction; } else if (value === 'off') { unsafeWindow.Function = originalFunction; } }, }); QuickMenu.add({ name: '开启 eval 调试', type: 'toggle', shouldInitRun: true, shouldAddMenu: () => { return unsafeWindow === unsafeWindow.top; }, callback: (value) => { // 保存原始的 eval 函数 const originalEval = eval.originalEval ? eval.originalEval : eval; eval.originalEval = originalEval; if (value === 'on') { // 定义一个新的 eval 函数 const patchedEval = function (code) { // 在 eval 的代码前插入 debugger 语句 const codeWithDebugger = `${patchCode}; ${code}`; return originalEval(codeWithDebugger); }; patchedEval.prototype = originalEval.prototype; // 替换全局的 eval 函数 unsafeWindow.eval = patchedEval; } else if (value === 'off') { unsafeWindow.eval = originalEval; } }, }); QuickMenu.add({ name: '清空缓存', type: 'button', shouldInitRun: false, shouldAddMenu: () => { return unsafeWindow === unsafeWindow.top; }, callback: () => { QuickMenu.clearStore(); }, }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址