恢复 console.log()

IT技术 javascript google-chrome prototypejs console.log
2021-03-15 19:38:49

出于某种原因,Magento附带的原型框架(或其他 JavaScript 代码)正在替换标准控制台功能,因此我无法调试任何东西。在 JavaScript 控制台中写下console我得到以下输出:

> console
Object
assert: function () {}
count: function () {}
debug: function () {}
dir: function () {}
dirxml: function () {}
error: function () {}
group: function () {}
groupEnd: function () {}
info: function () {}
log: function () {}
profile: function () {}
profileEnd: function () {}
time: function () {}
timeEnd: function () {}
trace: function () {}
warn: function () {}

Google Chrome version 13.0.782.112在 Linux 上使用

Prototype JavaScript framework, version 1.6.0.3

有没有快速解决这个问题的方法?

6个回答

由于原始控制台在 window.console 对象中,请尝试window.consoleiframe以下位置恢复

var i = document.createElement('iframe');
i.style.display = 'none';
document.body.appendChild(i);
window.console = i.contentWindow.console;
// with Chrome 60+ don't remove the child node
// i.parentNode.removeChild(i);

在 Chrome 14 上对我有用。

@NickCoad 它在最后仍然有效i.parentNode.removeChild(i),不是吗?
2021-04-22 19:38:49
这个答案实际上适用于当前版本的 Chrome(52+),而接受的答案则不然。
2021-04-27 19:38:49
我正在使用 Chrome 63 (Canary) 并且这个答案有效,但只是没有线i.parentNode.removeChild(i);
2021-05-05 19:38:49
对于任何将要使用它的人,记住自己清理干净。又名: i.parentNode.removeChild(i);
2021-05-08 19:38:49
这是我见过最有创意的回答!谢谢你。
2021-05-18 19:38:49

例如,

delete console.log

也会恢复console.log

console.log = null;
console.log;         // null

delete console.log;
console.log;         // function log() { [native code] }
可以确认...它在较新的 chrome 中不起作用。我正在扩展 owncloud,他们删除了 console.log(WTF?)
2021-04-28 19:38:49
试试吧delete window.console,这在 chrome 30.x 中对我有用;
2021-04-29 19:38:49
不再适用于 Chrome 52。可以在 Twitter 上测试,例如:console.log-> function() {},删除 console.log 或 window.console.log 只会将其删除,而不会恢复原始行为。
2021-05-05 19:38:49
这里有一个技巧,可以帮助 Chrome 在使用时不恢复本机日志功能delete console.log......如果你愿意安装(或已经拥有)TamperMonkey,那么你只需要一个简单的脚本...... setTimeout(() => { unsafeWindow.console = window.console; }, 2000); Tampermonkey 脚本获取他们自己的副本window对象,因此您需要做的就是在延迟后恢复原始控制台对象。根据需要调整...(确保删除默认值// @grant none)。
2021-05-16 19:38:49
是的!这更好!这就是我喜欢 stackoverflow 的原因:D
2021-05-20 19:38:49

Magento 中有以下代码/js/varien/js.js- 将其注释掉并且它会起作用。

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

以防万一有人面临同样的情况。 我没有回复 Xaerxess 的原始答案,因为我没有足够的声誉来做到这一点。 看起来这是正确的答案,但出于某种原因,我注意到有时它在我的软件中有效,有时却不起作用......

所以我尝试在运行脚本之前完成删除,看起来一切正常 100%。

if (!("console" in window) || !("firebug" in console))
{

  console.log = null;
  console.log;         // null

  delete console.log;

  // Original by Xaerxess
  var i = document.createElement('iframe');
  i.style.display = 'none';
  document.body.appendChild(i);
  window.console = i.contentWindow.console;

}

谢谢大家。

这不应该是现在接受的答案,因为最初接受的答案在最新的 Chrome 或 Firefox 上不再适用吗?
2021-04-20 19:38:49
这对我有用。只是这样delete console.log做没有用,所以这应该是公认的答案。
2021-05-06 19:38:49

delete window.consoleconsole在 Firefox 和 Chrome 中恢复原始对象。

这是如何运作的?window是一个托管对象,通常它是通过所有实例之间的通用原型实现的(浏览器中有许多选项卡)。

外部库/框架(或Firebug等)的一些愚蠢的开发人员会覆盖window实例的属性控制台,但它不会损坏window.prototype. 通过delete操作符,我们从console.*方法返回到原型代码。