'consola' es un error no definido para Internet Explorer

Resuelto user246114 asked hace 14 años • 21 respuestas

Estoy usando Firebug y tengo algunas declaraciones como:

console.log("...");

en mi página. En IE8 (probablemente también en versiones anteriores) recibo errores de script que dicen que "consola" no está definida. Intenté poner esto en la parte superior de mi página:

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

Todavía recibo los errores. ¿Alguna forma de deshacerse de los errores?

user246114 avatar Jul 25 '10 02:07 user246114
Aceptado

Intentar

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

No se puede hacer referencia directa a una variable indefinida. Sin embargo, todas las variables globales son atributos del mismo nombre del contexto global ( windowen el caso de los navegadores), y acceder a un atributo indefinido está bien.

O utilícela if (typeof console === 'undefined') console = ...si desea evitar la variable mágica window, consulte la respuesta de @Tim Down .

kennytm avatar Jul 24 '2010 19:07 kennytm

Pega lo siguiente en la parte superior de tu JavaScript (antes de usar la consola):

/**
 * Protect window.console method calls, e.g. 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;
  }
})();

El contenedor de cierre de función tiene como alcance las variables para no definir ninguna variable. Esto protege contra indefinidos consolee indefinidos console.debug(y otros métodos faltantes).

EDITAR: Noté que HTML5 Boilerplate usa un código similar en su archivo js/plugins.js, si está buscando una solución que (probablemente) se mantenga actualizada.

Peter Tseng avatar Dec 11 '2012 09:12 Peter Tseng

Otra alternativa es el typeofoperador:

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

Otra alternativa más es utilizar una biblioteca de registro, como mi propia log4javascript .

Tim Down avatar Jul 24 '2010 20:07 Tim Down

Para obtener una solución más sólida, 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;
        }
    }
}());
Vinícius Moraes avatar Jun 04 '2013 11:06 Vinícius Moraes