有没有办法关闭console.log
我的JavaScript代码中的所有语句,以进行测试?
在脚本中重新定义console.log函数.
console.log = function() {}
就是这样,没有更多的消息来控制台.
编辑:
扩展了Cide的想法.一个自定义记录器,可用于从代码中切换日志记录开/关.
从我的Firefox控制台:
var logger = function() { var oldConsoleLog = null; var pub = {}; pub.enableLogger = function enableLogger() { if(oldConsoleLog == null) return; window['console']['log'] = oldConsoleLog; }; pub.disableLogger = function disableLogger() { oldConsoleLog = console.log; window['console']['log'] = function() {}; }; return pub; }(); $(document).ready( function() { console.log('hello'); logger.disableLogger(); console.log('hi', 'hiya'); console.log('this wont show up in console'); logger.enableLogger(); console.log('This will show up!'); } );
如何使用上面的"记录器"?在ready事件中,调用logger.disableLogger以便不记录控制台消息.在要将消息记录到控制台的方法中添加对logger.enableLogger和logger.disableLogger的调用.
以下是更彻底的:
var DEBUG = false; if(!DEBUG){ if(!window.console) window.console = {}; var methods = ["log", "debug", "warn", "info"]; for(var i=0;i这将使控制台中的常用方法归零(如果存在),并且可以无错误地调用它们,并且几乎不会产生性能开销.对于像IE6这样没有控制台的浏览器,将创建虚拟方法以防止错误.当然,Firebug中还有更多功能,如跟踪,配置文件,时间等.如果您在代码中使用它们,可以将它们添加到列表中.
您还可以检查调试器是否具有这些特殊方法(即IE),并将其不支持的方法归零:
if(window.console && !console.dir){ var methods = ["dir", "dirxml", "trace", "profile"]; //etc etc for(var i=0;i
3> Cide..:据我可以从告诉文档,萤火虫不提供任何变量来切换调试状态.相反,将console.log()包装在有条件地调用它的包装中,即:
DEBUG = true; // set to false to disable debugging function debug_log() { if ( DEBUG ) { console.log.apply(this, arguments); } }要不必更改所有现有呼叫,您可以使用此代码:
DEBUG = true; // set to false to disable debugging old_console_log = console.log; console.log = function() { if ( DEBUG ) { old_console_log.apply(this, arguments); } }
如果您在编辑器中具有良好的查找/替换功能,这也是正确的方法.
至少如果您使用jQuery,则无需编写自己的包装器,顺便说一句。jQuery调试插件效果很好。此外,它还提供了在没有浏览器的情况下在控制台上模拟console.log的功能。http://trainofthoughts.org/blog/2007/03/16/jquery-plugin-debug/
4> istepaniuk..:你不应该!
覆盖内置函数不是一个好习惯.也无法保证您将抑制所有输出,您使用的其他库可能会还原您的更改,还有其他可能写入控制台的函数;
.dir()
,.warning()
,.error()
,.debug()
,.assert()
等.正如一些人所建议的那样,您可以
DEBUG_MODE
有条件地定义变量和日志.根据代码的复杂性和性质,编写自己的记录器对象/函数可能是一个好主意,该对象/函数包含控制台对象并具有内置的此功能.那将是处理仪器的合适场所.也就是说,出于"测试"目的,您可以编写测试而不是打印到控制台.如果您没有进行任何测试,并且这些
console.log()
行只是帮助您编写代码,只需删除它们即可.
`"你使用的其他库可以恢复你的更改"`:如果我在一开始就禁用`console.log`,它们就无法恢复到旧的功能.好吧,他们可以重写`console.log`源代码,但为什么呢?`"编写自己的记录器对象/函数来包装控制台对象可能是一个好主意"`:我过去做过这个,这是个坏主意.控制台输出的跟踪是指包装器而不是调用它的行,这使得调试更加困难.
@LucasMalor"一开始"意味着代码耦合到该基础结构,从而限制了它的可重用性.但是很难概括; 在游戏中,一些DOM动画与复杂SPA中的域逻辑不同,后者不应该是浏览器感知的,更不用说知道一些叫做"控制台"的东西了.在这种情况下,你应该有一个适当的测试策略,而不是黑客攻击一些`console.log('看,它到达这一点');`在你的代码中,当其他一切都失败时,你确实可以使用`debugger;`指令.
@MarcoSulla我认为他正在编写更清晰的代码.说"......你不应该使用JS"有点沉重.理想情况下,作为程序员,无论您的环境如何,您都应该尽可能模块化; 如果它不关心浏览器,那么你可以在更多的地方部署它:这是一个不用担心破坏你的东西的依赖.所以,恕我直言,他确实是对的.请记住,您首先会说"如果您创建一个通用的基本模板......",它本身就会引入依赖关系.这种想法使软件复杂化.值得深思.
5> Joey Schoole..:我意识到这是一个老帖子,但它仍然出现在谷歌搜索结果的顶部,所以这里有一个更优雅的非jQuery解决方案,适用于最新的Chrome,FF和IE.
(function (original) { console.enableLogging = function () { console.log = original; }; console.disableLogging = function () { console.log = function () {}; }; })(console.log);
6> Scott Greenf..:我知道你问过如何禁用console.log,但这可能是你真正想要的.这样您就不必显式启用或禁用控制台.它只是为那些没有打开或安装它的人防止那些讨厌的控制台错误.
if(typeof(console) === 'undefined') { var console = {}; console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {}; }
7> Swanidhi..:只需更改标志
DEBUG
即可覆盖console.log函数.这应该可以解决问题.var DEBUG = false; // ENABLE/DISABLE Console Logs if(!DEBUG){ console.log = function() {} }
我更进一步,将其包装在记录器函数/类中.像这样:`function myLog(msg){if(debug){console.log(msg); }
8> Xavier13..:我很惊讶所有那些没有人结合的答案:
没有jquery
匿名函数不污染全局命名空间
处理window.console未定义的情况
只需修改控制台的.log功能即可
我会这样做:
(function () { var debug = false if (debug === false) { if ( typeof(window.console) === 'undefined') { window.console = {}; } window.console.log = function () {}; } })()
9> Chris S..:如果您使用的是IE7,则不会定义控制台.所以更友好的IE版本将是:
if (typeof console == "undefined" || typeof console.log == "undefined") { var console = { log: function() {} }; }
10> graphefruit..:在我搜索了这个问题以及在我的cordova应用程序中尝试过之后,我只是想警告每个开发人员都不要覆盖Windows手机
console.log因为应用程序会在启动时崩溃.
如果你是幸运的话,如果你正在开发本地,它不会崩溃,但是在商店中提交会导致应用程序崩溃.
只是覆盖
window.console.log如果你需要.
这在我的应用程序中有效:
try { if (typeof(window.console) != "undefined") { window.console = {}; window.console.log = function () { }; window.console.info = function () { }; window.console.warn = function () { }; window.console.error = function () { }; } if (typeof(alert) !== "undefined") { alert = function () { } } } catch (ex) { }
11> Justin..:这是来自SolutionYogi和Chris S.的答案的混合.它维护console.log行号和文件名.示例jsFiddle.
// Avoid global functions via a self calling anonymous one (uses jQuery) (function(MYAPP, $, undefined) { // Prevent errors in browsers without console.log if (!window.console) window.console = {}; if (!window.console.log) window.console.log = function(){}; //Private var var console_log = console.log; //Public methods MYAPP.enableLog = function enableLogger() { console.log = console_log; }; MYAPP.disableLog = function disableLogger() { console.log = function() {}; }; }(window.MYAPP = window.MYAPP || {}, jQuery)); // Example Usage: $(function() { MYAPP.disableLog(); console.log('this should not show'); MYAPP.enableLog(); console.log('This will show'); });