在IE中testingconsole.log语句

可能重复:
“控制台”是未定义Internet Explorer的错误

如果在代码中有console.log语句,Internet Explorer将会引发JavaScript错误(至less在我们的Intranet用户安装的IE7中)。

我使用Firefox进行大部分开发testing,主要是因为Firebug提供的function(我使用了很多控制台语句),但是我也需要在IE中进行testing。

如果我将以下内容添加到我的JavaScript中,则不会引发错误。

 var debugging = false; if (typeof console == "undefined") var console = { log: function() {} }; 

问题是,如果debugging模式为false,我想触发一个事件。 如果我创build一个函数来testingdebugging是否为false,并执行一个操作(此时只是一个警报),但是当我尝试执行以下操作时,我收到一个IE错误,说没有定义控制台

 var debugging = false; // or true if (typeof console == "undefined") var console = { log: function() {consoleMsg()} }; function consoleMsg() { if(!debugging) { alert('Console.log event in Production Code'); } 

如果有人能帮我修理我的代码,提供一个更好的方法来帮助我实现我的目标,或者指导我去一个资源来教育自己,我会非常感激。

你不必跳过所有这些篮球。 使用前请检查控制台是否存在。

所以,而不是:

 console.log('foo'); 

使用:

 window.console && console.log('foo'); 

…你不会有任何错误。


或者,您可以在脚本的顶部检查它,如果未定义,只需填写一个空的函数即可:

 // At the top of your script: if ( ! window.console ) console = { log: function(){} }; // If you use other console methods, add them to the object literal above // Then, anywhere in your script: console.log('This message will be logged, but will not cause an error in IE7'); 

对于更强大的解决scheme,请使用这段代码(从twitter的源代码中获取):

 // Avoid `console` errors in browsers that lack a console. (function() { var method; var noop = function () {}; var methods = [ 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 'timeStamp', 'trace', 'warn' ]; var length = methods.length; var console = (window.console = window.console || {}); while (length--) { method = methods[length]; // Only stub undefined methods. if (!console[method]) { console[method] = noop; } } }()); 

“控制台”本身需要是一个function,以及“日志”。 所以:

 if(typeof(console) === 'undefined') { console = function(){}; console.log = function(){consoleMsg()}; } 

你有没有试试看:

 var debugging = false; // or true try { console.log(); } catch(ex) { /*var*/ console = { log: function() {consoleMsg()} }; } 
 (function(debug) { var console; function wrapConsoleMethod(fnName) { if(fnName in console) console[ fnName ] = function(fn) { return function() { if(debug) return fn.apply(console, arguments); else alert('Console event in Production Code'); }; }(console[ fnName ]); else ; // fn not in console }; if(!('console' in window)) window.console = { log : function() {} // ... }; console = window.console; wrapConsoleMethod('log'); // ... })(true /* debug */); console.log('test');