27. 如何在浏览器里获取原始的 console 对象
约 439 字大约 1 分钟
2025-06-09
当页面中的 console
对象可能被修改或覆盖时,以下是几种获取原始 console
对象的方法:
1. 使用 iframe 获取纯净的 console
const iframe = document.createElement("iframe");
iframe.style.display = "none";
document.body.appendChild(iframe);
const originalConsole = iframe.contentWindow.console;
// 使用后移除iframe
document.body.removeChild(iframe);
// 使用原始console
originalConsole.log("这是原始console方法");
2. 使用 Function 构造函数
const getOriginalConsole = new Function("return console;");
const originalConsole = getOriginalConsole();
originalConsole.log("原始console");
3. 使用 Web Workers(最可靠的方法)
const blob = new Blob(["self.postMessage(console);"], {
type: "application/javascript",
});
const url = URL.createObjectURL(blob);
const worker = new Worker(url);
worker.onmessage = function (e) {
const originalConsole = e.data;
originalConsole.log("来自Worker的原始console");
worker.terminate();
URL.revokeObjectURL(url);
};
4. 在页面加载前捕获(通过脚本注入)
// 在页面其他脚本执行前运行的脚本
const script = document.createElement("script");
script.textContent = `
window._originalConsole = window.console;
`;
document.documentElement.appendChild(script);
script.remove();
// 之后可以通过 _originalConsole 访问
window._originalConsole.log("原始方法");
5. 通过 Error 对象的 stack 特性
function getOriginalConsole() {
try {
null[0](); // 故意引发错误
} catch (e) {
const iframe = document.createElement("iframe");
document.body.appendChild(iframe);
const originalConsole = iframe.contentWindow.console;
document.body.removeChild(iframe);
return originalConsole;
}
}
const originalConsole = getOriginalConsole();
注意事项
- 同源策略:iframe 方法需要同源,跨域 iframe 无法访问其内容
- 执行时机:需要在页面其他脚本修改 console 前执行
- 浏览器扩展:某些浏览器扩展也可能会修改 console 对象
- 沙盒环境:某些安全环境可能限制这些方法的有效性
最佳实践
如果只是担心 console 被覆盖,可以尽早保存引用:
<script>
// 放在<head>中最先执行
window._originalConsole = {
log: console.log.bind(console),
warn: console.warn.bind(console),
error: console.error.bind(console),
// 其他需要的方法...
};
</script>
这样即使后面的代码修改了 console,你仍然可以通过 _originalConsole
使用原始方法。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于