Tampermonkey中console.log覆写失效问题及修复咨询
修复Tampermonkey中console.log覆盖失效的问题
问题原因
Tampermonkey默认启用沙箱隔离机制,脚本运行在独立环境中,你直接操作的console是Tampermonkey封装后的对象,并非浏览器原生全局console,因此覆盖console.log的逻辑无法生效。而Node.js或Chrome控制台无沙箱限制,直接操作原生console,所以逻辑能正常运行。
两种修复方案
方案一:禁用沙箱(最简单)
在脚本元数据中添加@grant none,让脚本直接运行在页面全局环境,此时操作的console就是原生对象:
// ==UserScript== // @name Test: overriding console.log // @namespace http://tampermonkey.net/ // @version 0.2 // @description try to take over the world! // @author You // @match https://example.com // @run-at document-idle // @noframes // @grant none // 新增该行禁用沙箱 // ==/UserScript== var consoleLog = console.log; var logs = []; console.log = function() { logs.push(arguments[0]); consoleLog.apply(console, ["[Test App] ", ...arguments]); }; console.log('Hello, world!'); console.log(logs);
方案二:保留沙箱,操作全局console
如果需要使用Tampermonkey的API(不能禁用沙箱),则通过unsafeWindow访问页面全局的原生console:
// ==UserScript== // @name Test: overriding console.log // @namespace http://tampermonkey.net/ // @version 0.2 // @description try to take over the world! // @author You // @match https://example.com // @run-at document-idle // @noframes // @grant unsafeWindow // 声明unsafeWindow权限 // ==/UserScript== // 获取页面全局的原生console.log var consoleLog = unsafeWindow.console.log; var logs = []; unsafeWindow.console.log = function() { logs.push(arguments[0]); consoleLog.apply(unsafeWindow.console, ["[Test App] ", ...arguments]); }; // 调用全局console触发覆盖逻辑 unsafeWindow.console.log('Hello, world!'); unsafeWindow.console.log(logs);
验证结果
修改后访问https://example.com,控制台会输出预期内容:
[Test App] Hello, world! ["Hello, world!"]
内容的提问来源于stack exchange,提问作者丶 Limeー来夢 丶
相关产品推荐
相关产品推荐

