2011-09-28 46 views
45

Possible Duplicate:
'console' is undefined error for internet explorer测试为的console.log报表IE

如果你在你的代码console.log语句,Internet Explorer将抛出一个JavaScript错误(至少在IE7这是我们的内网用户已经安装的)。

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

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

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

问题是我想在调试模式为false时触发一个事件。如果我创建一个函数来测试调试是否为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'); 
} 

如果有人可以帮助我解决我的代码,提供了一个更好的办法来帮助我实现我的目标,或直接我的资源,以edumacate自己,我会非常感激。

+5

http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer检查 –

回答

137

你不必跳过所有这些箍。在使用之前只需检查控制台是否存在。

因此,而不是:

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'); 

对于更强大的解决方案,请使用这段代码(取自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; 
     } 
    } 
}()); 
+3

如果console没有定义,那么仍然会产生一个ReferenceError。 – pimvdb

+4

@pimvdb - 忘记添加'window.'部分。谢谢。更新。 –

+1

修复了一个小错误:必须是'window.console || (console = {log:function(){}});'而不是'window.console || console = {log:function(){}};' – some

5

'console'本身需要是一个函数,如以及'日志'。所以:

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

为什么它应该是一个功能?我试过:'console()',并且出现错误:'object'console'不是函数' –

+2

它是Firefox中的一个对象,带有萤火虫,Chrome,Safari和Opera。 – some

+0

欣赏尝试向此答案添加其他信息,但用建议的扩展功能创建新答案会更合适。 – JDB

2

你尝试try-catch

var debugging = false; // or true 
try { 
    console.log(); 
} catch(ex) { 
    /*var*/ console = { log: function() {consoleMsg()} }; 
} 
+0

+1我把它放在我的js的顶部,现在我可以在任何地方使用'console.log(myVariable)',谢谢! –

1
(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');