2011-09-28 8 views
45

Possible Duplicate:
'console' is undefined error for internet explorerPruebas de declaraciones console.log en IE

Si tiene console.log declaraciones en su código, Internet Explorer arrojará un error de JavaScript (al menos en Internet Explorer 7, que es lo que nuestros usuarios de la intranet han instalado).

Estoy usando Firefox para la mayoría de mis pruebas de desarrollo principalmente debido a la funcionalidad proporcionada por Firebug (donde uso muchas instrucciones de consola) pero también necesito probarla en IE.

si agrego lo siguiente a mi JavaScript, no se produce el error.

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

El problema es que me gustaría desencadenar un evento si el modo de depuración es falso. Si creo una función para probar si la depuración es falsa y realizo una acción (en este momento solo una alerta) pero cuando intento hacer lo siguiente recibo un error de IE que dice La consola no está definida.

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

Si alguien pudiera ayudarme a arreglar mi código, proporcionar una mejor manera de ayudar a alcanzar mi meta, o me directo a un recurso a edumacate yo estaría muy agradecido.

+5

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

Respuesta

137

No tiene que pasar por todos estos aros. Simplemente verifique si la consola existe antes de usarla.

Así, en lugar de:

console.log('foo'); 

Uso:

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

... y usted no recibirá errores.


Alternativamente, usted podría comprobar que en la parte superior de su script, y si es indefinido, simplemente llenarlo con una función de vacío:

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

Para una solución más robusta , utilice este fragmento de código (tomado del código fuente de 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

Eso todavía daría un 'ReferenceError' si' console' no está definido. – pimvdb

+4

@pimvdb - olvidó agregar la parte 'ventana'. Gracias. Actualizado. –

+1

Se corrigió un error menor: debe ser 'window.console || (console = {log: function() {}}); 'en lugar de' window.console || console = {log: function() {}}; ' – some

5

'consola' sí necesita ser una función, ya que así como 'log'. Por lo tanto:

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

¿Por qué debería ser una función? Intenté: 'console()', y obtuve un error: 'object 'console' no es una función' –

+2

Es un objeto en Firefox con Firebug, Chrome, Safari y Opera. – some

+0

Apreciar el intento de agregar información adicional a esta respuesta, pero sería más apropiado crear una nueva respuesta con las capacidades expandidas sugeridas. – JDB

2

¿Usted intentó try-catch:

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

+1 Puse esto en la parte superior de mi js y ahora puedo usar 'console.log (myVariable)' en cualquier lugar, ¡gracias! –

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