有些网站会在放置小部件的每个网页上停用Chrome控制台(console.log无效)。
是否可以重新启用它?(如黑客或其他内容)
P.S。据我了解,他们只是重写控制台功能。所以我的问题基本上是这样的:是否有任何解决方案将其重新恢复正常?(如果我对阻塞控制台的理解是正确的)
答案 0 :(得分:2)
这是你可以使用的黑客。我看不到有任何方法可以将其重置为Chrome使用的原始Console
类,例如window.console = new Console()
,因为它似乎无法访问。
相反,您需要获取另一个console
对象并将当前window.console
指向该对象。最简单的方法是创建一个隐藏的iframe并使用那个。请注意,您必须在页面上保留iframe。如果将其删除,console
将被清除并完全停止工作。
这是一个jQuery 1-liner和a working fiddle:
window.console =
$('<iframe src="about:blank" style="display:none;"/>')
.appendTo(document.body)[0].contentWindow.console;
如果你想要一个纯粹的JS解决方案(fiddle):
var theFrame = document.createElement('iframe');
theFrame.src = "about:blank";
theFrame.style.display = "none";
document.body.appendChild(theFrame);
window.console = theFrame.contentWindow.console;
唯一需要注意的是,如果当前页面本身位于带有sandbox
的iframe中,就像堆栈片段一样,那么您可能会遇到安全错误,而且您可以做很多事情。
此代码段[当前]不会运行,例如因为它只有sandbox="allow-scripts"
// break the console
window.console = {
log: function(x) { alert('haha I hijacked your console'); }
}
console.log('debug message');
var theFrame = document.createElement('iframe');
theFrame.src = "about:blank";
theFrame.style.display = "none";
document.body.appendChild(theFrame);
window.console = theFrame.contentWindow.console;
console.log('debug message');
答案 1 :(得分:0)
你说“重新启用”。我不知道该怎么做。另一方面,如果您控制页面,则可以防止它被覆盖。只需确保首先执行此操作。
(function(origConsole) {
Object.defineProperty(window, 'console', {
get: function() { return origConsole; },
set: function() {},
enumerable: true,
configurable: false,
});
}(window.console));
(function(origLog) {
Object.defineProperty(window.console, 'log', {
get: function() { return origLog; },
set: function() {},
enumerable: true,
configurable: false,
});
}(window.console.log.bind(window.console)));
甚至可能使用扩展名
注入它