恢复console.log()

s3v*_*v3n 47 javascript google-chrome prototypejs console.log

出于某种原因,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 () {}
Run Code Online (Sandbox Code Playgroud)

Google Chrome version 13.0.782.112在Linux上使用.

Prototype JavaScript framework, version 1.6.0.3

有没有快速解决方法?

Xae*_*ess 66

由于原始控制台位于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);
Run Code Online (Sandbox Code Playgroud)

适用于Chrome 14.

  • 这个答案实际上适用于当前版本的Chrome(52+),而接受的答案却没有. (8认同)
  • 我使用Chrome 63(金丝雀)和这个答案的作品,但只是没了线`i.parentNode.removeChild(I);`. (8认同)
  • 对于任何打算使用它的人,**请记得在自己之后清理.AKA:`i.parentNode.removeChild(i);` (6认同)
  • 仅在使用完控制台后自行清洁!没有孩子就无法正常工作。 (2认同)

pim*_*vdb 42

例如,

delete console.log
Run Code Online (Sandbox Code Playgroud)

还会恢复console.log:

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

delete console.log;
console.log;         // function log() { [native code] }
Run Code Online (Sandbox Code Playgroud)

  • 在Chrome 52中不再起作用.可以在Twitter上测试,例如:`console.log` - >`function(){}`,删除console.log或window.console.log只会删除它,而不会恢复原始行为. (19认同)
  • 尝试`删除window.console`,这对我来说在chrome 30.x中起作用; (9认同)
  • 这在Chrome 25.0.1364.172中不再有效 (3认同)
  • 可以确认……它在较新的 chrome 中不起作用。我正在扩展 owncloud,他们删除了 console.log(WTF?) (2认同)
  • 这里有一个技巧可以帮助 Chrome 在使用 `delete console.log` 时不恢复原生日志功能......如果你愿意安装(或已经拥有)TamperMonkey,那么你只需要一个简单的脚本...... `setTimeout (() => { unsafeWindow.console = window.console; }, 2000);` Tampermonkey 脚本获得了自己的 `window` 对象副本,因此您需要做的就是在延迟后恢复原始控制台对象。根据需要调整...(确保删除默认的`// @grant none`)。 (2认同)

Fra*_*Kim 12

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() {}
}
Run Code Online (Sandbox Code Playgroud)


小智 11

以防万一有人面临同样的情况。 我没有回复 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;

}
Run Code Online (Sandbox Code Playgroud)

谢谢大家。


gav*_*koa 7

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

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

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