有没有办法解决网站中断 console.log
Is there a way to work-around site(s) breaking console.log
我的 Chrome DevTools 控制台摘录:
Navigated to https://twitter.com/
console.log.toString();
"function (){}"
Navigated to http://linuxfr.org/
console.log.toString();
"function log() { [native code] }"
我设法使用 Chrome 扩展在 twitter.com 的主框架中注入代码,但我很难理解为什么我的代码似乎没有 运行。看起来我的代码 运行 没问题,除了 console.log
什么都没有产生!
问题:有没有办法调用"now gone"console.log
"native code"?
(关于那种 JavaScript "WAT" 行为的评论 收回 ,有点)
据我所知,这取决于替换的深度。
例如如果是这样
console.log = function () {};
原始原生 log
功能仍处于原型阶段。您可以使用 __proto__
属性 或 Object.getPrototypeOf
方法访问它。
console.log = null
Object.getPrototypeOf(console).log
//log() { [native code] }
您也可以只从原始控制台对象中删除替换项
delete console.log
//true
console.log
//log() { [native code] }
但是如果我像这样替换日志函数,以上所有代码将无法工作
console.__proto__.__proto__.log = function () {}
不幸的是,我不知道这种情况的解决方法。
基于上面的讨论和@JaromandaX,下面JavaScript: The Definitive Guide是一个简单的 polyfill。
function log() {
if (location.hostname === 'twitter.com'){
Object.getPrototypeOf(console).log.apply(console, arguments);
} else {
console.log.apply(console, arguments);
}
}
由于这是一个 Chrome 扩展,您将内容脚本设置为 run_at: "document_start"
- 您可以(理论上)"grab" console.log
/ error
/ dir
/ info
等等,在 Twitter 弄脏之前
实际上,知道 twitter 只替换日志、警告、信息、错误,你可以简单地做:
var _console = ['log', 'warn', 'info', 'error'].reduce(function(result, key) {
result[key] = console[key].bind(console);
return result
}, {});
然后你可以使用_console.log
和朋友
我的 Chrome DevTools 控制台摘录:
Navigated to https://twitter.com/
console.log.toString();
"function (){}"
Navigated to http://linuxfr.org/
console.log.toString();
"function log() { [native code] }"
我设法使用 Chrome 扩展在 twitter.com 的主框架中注入代码,但我很难理解为什么我的代码似乎没有 运行。看起来我的代码 运行 没问题,除了 console.log
什么都没有产生!
问题:有没有办法调用"now gone"console.log
"native code"?
(关于那种 JavaScript "WAT" 行为的评论 收回 ,有点)
据我所知,这取决于替换的深度。 例如如果是这样
console.log = function () {};
原始原生 log
功能仍处于原型阶段。您可以使用 __proto__
属性 或 Object.getPrototypeOf
方法访问它。
console.log = null
Object.getPrototypeOf(console).log
//log() { [native code] }
您也可以只从原始控制台对象中删除替换项
delete console.log
//true
console.log
//log() { [native code] }
但是如果我像这样替换日志函数,以上所有代码将无法工作
console.__proto__.__proto__.log = function () {}
不幸的是,我不知道这种情况的解决方法。
基于上面的讨论和@JaromandaX,下面JavaScript: The Definitive Guide是一个简单的 polyfill。
function log() {
if (location.hostname === 'twitter.com'){
Object.getPrototypeOf(console).log.apply(console, arguments);
} else {
console.log.apply(console, arguments);
}
}
由于这是一个 Chrome 扩展,您将内容脚本设置为 run_at: "document_start"
- 您可以(理论上)"grab" console.log
/ error
/ dir
/ info
等等,在 Twitter 弄脏之前
实际上,知道 twitter 只替换日志、警告、信息、错误,你可以简单地做:
var _console = ['log', 'warn', 'info', 'error'].reduce(function(result, key) {
result[key] = console[key].bind(console);
return result
}, {});
然后你可以使用_console.log
和朋友