“控制台”是Internet Explorer的未定义错误

我正在使用Firebug,并有一些像这样的陈述:

console.log("..."); 

在我的页面。 在IE8(也许更早的版本)我得到脚本错误说'控制台'是未定义的。 我试着把这个放在我的页面顶部:

 <script type="text/javascript"> if (!console) console = {log: function() {}}; </script> 

我仍然得到错误。 任何方式来摆脱错误?

尝试

 if (!window.console) console = ... 

未定义的variables不能直接引用。 但是,所有的全局variables都是全局上下文的相同名称的属性(在浏览器的情况下是window ),并且访问未定义的属性是好的。

或者使用if (typeof console === 'undefined') console = ...如果你想避开魔术variableswindow ,请参阅@Tim Down的答案 。

将以下内容粘贴到JavaScript的顶部(在使用控制台之前):

 /** * Protect window.console method calls, eg console is not defined on IE * unless dev tools are open, and IE doesn't define console.debug * * Chrome 41.0.2272.118: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear * Firefox 37.0.1: log,info,warn,error,exception,debug,table,trace,dir,group,groupCollapsed,groupEnd,time,timeEnd,profile,profileEnd,assert,count * Internet Explorer 11: select,log,info,warn,error,debug,assert,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd,trace,clear,dir,dirxml,count,countReset,cd * Safari 6.2.4: debug,error,log,info,warn,clear,dir,dirxml,table,trace,assert,count,profile,profileEnd,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd * Opera 28.0.1750.48: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear */ (function() { // Union of Chrome, Firefox, IE, Opera, and Safari console methods var methods = ["assert", "cd", "clear", "count", "countReset", "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed", "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd", "select", "table", "time", "timeEnd", "timeStamp", "timeline", "timelineEnd", "trace", "warn"]; var length = methods.length; var console = (window.console = window.console || {}); var method; var noop = function() {}; while (length--) { method = methods[length]; // define undefined methods as noops to prevent errors if (!console[method]) console[method] = noop; } })(); 

函数闭包装器将variables的范围定义为不定义任何variables。 这防范了未定义的console和未定义的console.debug (和其他缺less的方法)。

编辑:我注意到, HTML5 Boilerplate在其js / plugins.js文件中使用类似的代码,如果你正在寻找一个解决scheme,将(可能)保持最新。

另一种select是typeof运算符:

 if (typeof console == "undefined") { this.console = {log: function() {}}; } 

另外一个select是使用日志库,比如我自己的log4javascript 。

对于更强大的解决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; } } }()); 

在我的脚本中,我使用简写:

 window.console && console.log(...) // only log if the function exists 

或者,如果编辑每一个console.log行是不可能或不可行的,我会创build一个假的控制台:

 // check to see if console exists. If not, create an empty object for it, // then create and empty logging function which does nothing. // // REMEMBER: put this before any other console.log calls !window.console && (window.console = {} && window.console.log = function () {}); 

如果您打开了IE8中的“ Developer Tools ,并且您可以在“脚本”选项卡上使用“ Console文本框,则可以使用console.log()

 if (typeof console == "undefined") { this.console = { log: function() {}, info: function() {}, error: function() {}, warn: function() {} }; } 

我只在我的代码中使用console.log。 所以我包括一个非常短的2class轮

 var console = console || {}; console.log = console.log || function(){}; 

基于前两个答案

  • ViníciusMoraes
  • Peter Tseng

和文件

  • Internet Explorer(IE 10)
  • Safari(2012. 07. 23)
  • Firefox(2013. 05. 20.)
  • Chrome(2013. 01. 25.)和Chrome(2012.10.04)
  • 和我的一些知识

下面是这个问题的一个最好的实现,也就是说如果有一个实际存在的console.log,它通过console.log填补了不存在的方法的空白。

例如对于IE6 / 7,你可以用警报(愚蠢的,但工作)取代日志logging,然后包括下面的怪物(我称之为console.js):[随意删除评论,因为你认为合适的,我把它们留在参考,最小化者可以解决它们]:

 <!--[if lte IE 7]> <SCRIPT LANGUAGE="javascript"> (window.console = window.console || {}).log = function() { return window.alert.apply(window, arguments); }; </SCRIPT> <![endif]--> <script type="text/javascript" src="console.js"></script> 

和console.js:

  /** * Protect window.console method calls, eg console is not defined on IE * unless dev tools are open, and IE doesn't define console.debug */ (function() { var console = (window.console = window.console || {}); var noop = function () {}; var log = console.log || noop; var start = function(name) { return function(param) { log("Start " + name + ": " + param); } }; var end = function(name) { return function(param) { log("End " + name + ": " + param); } }; var methods = { // Internet Explorer (IE 10): http://msdn.microsoft.com/en-us/library/ie/hh772169(v=vs.85).aspx#methods // assert(test, message, optionalParams), clear(), count(countTitle), debug(message, optionalParams), dir(value, optionalParams), dirxml(value), error(message, optionalParams), group(groupTitle), groupCollapsed(groupTitle), groupEnd([groupTitle]), info(message, optionalParams), log(message, optionalParams), msIsIndependentlyComposed(oElementNode), profile(reportName), profileEnd(), time(timerName), timeEnd(timerName), trace(), warn(message, optionalParams) // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "msIsIndependentlyComposed", "profile", "profileEnd", "time", "timeEnd", "trace", "warn" // Safari (2012. 07. 23.): https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html#//apple_ref/doc/uid/TP40007874-CH8-SW20 // assert(expression, message-object), count([title]), debug([message-object]), dir(object), dirxml(node), error(message-object), group(message-object), groupEnd(), info(message-object), log(message-object), profile([title]), profileEnd([title]), time(name), markTimeline("string"), trace(), warn(message-object) // "assert", "count", "debug", "dir", "dirxml", "error", "group", "groupEnd", "info", "log", "profile", "profileEnd", "time", "markTimeline", "trace", "warn" // Firefox (2013. 05. 20.): https://developer.mozilla.org/en-US/docs/Web/API/console // debug(obj1 [, obj2, ..., objN]), debug(msg [, subst1, ..., substN]), dir(object), error(obj1 [, obj2, ..., objN]), error(msg [, subst1, ..., substN]), group(), groupCollapsed(), groupEnd(), info(obj1 [, obj2, ..., objN]), info(msg [, subst1, ..., substN]), log(obj1 [, obj2, ..., objN]), log(msg [, subst1, ..., substN]), time(timerName), timeEnd(timerName), trace(), warn(obj1 [, obj2, ..., objN]), warn(msg [, subst1, ..., substN]) // "debug", "dir", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "time", "timeEnd", "trace", "warn" // Chrome (2013. 01. 25.): https://developers.google.com/chrome-developer-tools/docs/console-api // assert(expression, object), clear(), count(label), debug(object [, object, ...]), dir(object), dirxml(object), error(object [, object, ...]), group(object[, object, ...]), groupCollapsed(object[, object, ...]), groupEnd(), info(object [, object, ...]), log(object [, object, ...]), profile([label]), profileEnd(), time(label), timeEnd(label), timeStamp([label]), trace(), warn(object [, object, ...]) // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "profile", "profileEnd", "time", "timeEnd", "timeStamp", "trace", "warn" // Chrome (2012. 10. 04.): https://developers.google.com/web-toolkit/speedtracer/logging-api // markTimeline(String) // "markTimeline" assert: noop, clear: noop, trace: noop, count: noop, timeStamp: noop, msIsIndependentlyComposed: noop, debug: log, info: log, log: log, warn: log, error: log, dir: log, dirxml: log, markTimeline: log, group: start('group'), groupCollapsed: start('groupCollapsed'), groupEnd: end('group'), profile: start('profile'), profileEnd: end('profile'), time: start('time'), timeEnd: end('time') }; for (var method in methods) { if ( methods.hasOwnProperty(method) && !(method in console) ) { // define undefined methods as best-effort methods console[method] = methods[method]; } } })(); 

在IE9中,如果控制台没有打开,这个代码:

 alert(typeof console); 

会显示“对象”,但是这个代码

 alert(typeof console.log); 

会抛出TypeErrorexception,但不会返回未定义的值;

所以,保证版本的代码将看起来类似于这样的:

 try { if (window.console && window.console.log) { my_console_log = window.console.log; } } catch (e) { my_console_log = function() {}; } 

注意到OP在IE中使用Firebug,所以假设它是Firebug Lite 。 这是一个奇怪的情况,因为当debugging器窗口打开时,在IE中定义了控制台,但是当Firebug已经运行时会发生什么? 不确定,但也许“firebugx.js”方法可能是在这种情况下testing的好方法:

资源:

https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187

  if (!window.console || !console.firebug) { 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() {} } 

(更新链接12/2014)

我正在使用fauxconsole ; 我修改了一下css,使它看起来更好,但工作得很好。

  // a simple if(console) { console.log("blah blah blah ..."); } /* * use .error() to attach error handlers and whenever * an error occurs it will automatically logged to the console * by jquery if you are using one * whenever an error occurs, see bellow. */ $('jQuery_selector').error(function(){ // and your error handling code here }); 

对于.error()引用,请访问http://api.jquery.com/error/

在IE中debugging,看看这个log4javascript

对于仅限于console.log(不debugging,跟踪,…)的IE8或控制台支持,您可以执行以下操作:

  • 如果console或console.log未定义:为控制台函数(跟踪,debugging,日志…)创build虚拟函数

    window.console = { debug : function() {}, ...};

  • 否则,如果console.log被定义(IE8)和console.debug(任何其他)没有定义:redirect所有日志loggingfunctionconsole.log,这允许保留这些日志!

    window.console = { debug : window.console.log, ...};

不知道在各种IE版本断言的支持,但任何build议是值得欢迎的。 还在这里发布了这个答案: 我如何使用Internet Explorer中的控制台日志logging?

 console = console || { debug: function(){}, log: function(){} ... } 

您可以使用下面的内容来给出一个额外的程度的保险,你已经覆盖了所有的基础。 首先使用typeof将避免任何undefined错误。 使用===也将确保types的名称实际上是string“undefined”。 最后,为了确保一致性,您需要向函数签名(我selectlogMsg )添加一个参数,因为您将打印到控制台的任何内容传递给日志函数。 这也让你的intellisense准确,并避免在您的JS知道IDE的任何警告/错误。

 if(!window.console || typeof console === "undefined") { var console = { log: function (logMsg) { } }; } 

有时控制台将在IE8 / 9中工作,但在其他时间失败。 这种不稳定的行为取决于你是否有开发工具打开,并在stackoverflow问题描述是否IE9支持console.log,它是一个真正的function?

遇到类似的问题,在IE9的子窗口中运行console.log,由window.open函数创build。

看来在这种情况下,控制台仅在父窗口中定义,并且在子窗口中未定义,直到您刷新它们。 同样适用于儿童窗户的儿童。

我通过包装下一个function来处理这个问题(下面是模块的片段)

 getConsole: function() { if (typeof console !== 'undefined') return console; var searchDepthMax = 5, searchDepth = 0, context = window.opener; while (!!context && searchDepth < searchDepthMax) { if (typeof context.console !== 'undefined') return context.console; context = context.opener; searchDepth++; } return null; }, log: function(message){ var _console = this.getConsole(); if (!!_console) _console.log(message); } 

控制台的存根在TypeScript中:

 if (!window.console) { console = { assert: () => { }, clear: () => { }, count: () => { }, debug: () => { }, dir: () => { }, dirxml: () => { }, error: () => { }, group: () => { }, groupCollapsed: () => { }, groupEnd: () => { }, info: () => { }, log: () => { }, msIsIndependentlyComposed: (e: Element) => false, profile: () => { }, profileEnd: () => { }, select: () => { }, time: () => { }, timeEnd: () => { }, trace: () => { }, warn: () => { }, } }; 

在遇到这么多问题之后(很难debugging错误,因为如果你打开开发者控制台,错误不会再发生了!)我决定做一个矫枉过正的代码,永远不必再为此烦恼了:

 if (typeof window.console === "undefined") window.console = {}; if (typeof window.console.debug === "undefined") window.console.debug= function() {}; if (typeof window.console.log === "undefined") window.console.log= function() {}; if (typeof window.console.error === "undefined") window.console.error= function() {alert("error");}; if (typeof window.console.time === "undefined") window.console.time= function() {}; if (typeof window.console.trace === "undefined") window.console.trace= function() {}; if (typeof window.console.info === "undefined") window.console.info= function() {}; if (typeof window.console.timeEnd === "undefined") window.console.timeEnd= function() {}; if (typeof window.console.group === "undefined") window.console.group= function() {}; if (typeof window.console.groupEnd === "undefined") window.console.groupEnd= function() {}; if (typeof window.console.groupCollapsed === "undefined") window.console.groupCollapsed= function() {}; if (typeof window.console.dir === "undefined") window.console.dir= function() {}; if (typeof window.console.warn === "undefined") window.console.warn= function() {}; 

Personaly我只使用console.log和console.error,但是这个代码处理Mozzila开发者networking中显示的所有其他函数: https : //developer.mozilla.org/en-US/docs/Web/API/console 。 只需将该代码放在页面的顶部,即可完成此操作。

您可以直接在Firefox中使用console.log(…),但不能在IE中使用。 在IE中,你必须使用window.console。