'consola' es un error no definido para Internet Explorer
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?
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 ( window
en 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 .
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 console
e 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.
Otra alternativa es el typeof
operador:
if (typeof console == "undefined") {
this.console = {log: function() {}};
}
Otra alternativa más es utilizar una biblioteca de registro, como mi propia log4javascript .
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;
}
}
}());