Estoy usando Firebug y tengo algunas declaraciones como:
console.log("...");
en mi pagina En IE8 (probablemente versiones anteriores también) 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 me salen los errores. ¿Alguna forma de deshacerse de los errores?
javascript
internet-explorer
internet-explorer-8
ie-developer-tools
usuario246114
fuente
fuente
typeof
en su if, evitará errores indefinidos:if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Respuestas:
Tratar
Una variable indefinida no se puede referir directamente. 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 use
if (typeof console === 'undefined') console = ...
si desea evitar la variable mágicawindow
, vea la respuesta de @Tim Down .fuente
<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>
en la parte superior de su página! Gracias kennyvar console = console || { log: function() {} };
window
:var console = window.console || { log: function() {} };
Pegue lo siguiente en la parte superior de su JavaScript (antes de usar la consola):
La envoltura de cierre de la función es abarcar las variables para no definir ninguna variable. Esto protege tanto contra indefinido
console
como indefinidoconsole.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.
fuente
Otra alternativa es el
typeof
operador:Otra alternativa es utilizar una biblioteca de registro, como mi propio log4javascript .
fuente
var
? Eso solo confundiría las cosas aquí. ¿O te refieres a asignar awindow.console
más que aconsole
?var
. ¿Por qué confundiría las cosas aquí?typeof
está garantizado para devolver una cadena y"undefined"
es una cadena. Cuando los dos operandos son del mismo tipo==
y===
se especifican para realizar exactamente los mismos pasos. El usotypeof x == "undefined"
es una manera sólida de probar six
no está definido en ningún ámbito y en cualquier entorno compatible con ECMAScript 3.Para una solución más robusta, use este código (tomado del código fuente de twitter):
fuente
En mis guiones, uso la abreviatura:
o, si no es posible o factible editar cada línea de console.log, creo una consola falsa:
fuente
if(!console) {console = {} ; console.log = function(){};}
!window.console && (window.console = { log: function () { } });
Puede usarlo
console.log()
si tieneDeveloper Tools
abierto en IE8 y también puede usar elConsole
cuadro de texto en la pestaña de secuencia de comandos.fuente
fuente
this
refierewindow
.Basado en dos respuestas anteriores de
y las documentaciones para
Aquí hay una implementación del mejor esfuerzo para el problema, lo que significa que si hay un console.log que realmente existe, llena los vacíos para los métodos no existentes a través de console.log.
Por ejemplo, para IE6 / 7, puede reemplazar el registro con alerta (estúpido pero funciona) y luego incluir el siguiente monstruo (lo llamé console.js): [Siéntase libre de eliminar los comentarios como mejor le parezca, los dejé como referencia, un minimizador puede abordarlos]:
y console.js:
fuente
methods.hasOwnProperty(method) &&
en el bucle for.> x = { a: 1, b: 2}
->Object {a: 1, b: 2}
yfor(var f in x) {console.log(f + " " + x[f]);} 'end'
->a 1 b 2 "end"
. Por lo tanto, un objeto anónimo creado no tiene ninguna propiedad adicional, ymethods
solo se crea antes delfor
ciclo. ¿Es posible hackear lo anterior?var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}
Nunca se sabe lo que una biblioteca ha hecho a los objetos en la cadena de herencia del objeto con el que está trabajando. Por lo tanto, la recomendación de las herramientas de calidad de código JavaScript como jshint y jslint para usarhasOwnProperty
.En IE9, si la consola no está abierta, este código:
mostrará "objeto", pero este código
lanzará la excepción TypeError, pero no devolverá un valor indefinido;
Entonces, la versión garantizada del código será similar a esto:
fuente
Solo estoy usando console.log en mi código. Así que incluyo un 2 liner muy corto
fuente
Noté que OP está usando Firebug con IE, así que suponga que es Firebug Lite . Esta es una situación funky ya que la consola se define en IE cuando se abre la ventana del depurador, pero ¿qué sucede cuando Firebug ya se está ejecutando? No estoy seguro, pero quizás el método "firebugx.js" podría ser una buena forma de probar en esta situación:
fuente:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
(enlaces actualizados 20/2014)
fuente
Estoy usando fauxconsole ; Modifiqué un poco el CSS para que se vea mejor pero funcione muy bien.
fuente
Para depurar en IE, consulte este log4javascript
fuente
Para IE8 o soporte de consola limitado a console.log (sin depuración, seguimiento, ...) puede hacer lo siguiente:
Si la consola O console.log no está definida: cree funciones ficticias para las funciones de la consola (rastreo, depuración, registro, ...)
window.console = { debug : function() {}, ...};
De lo contrario, si console.log está definido (IE8) Y console.debug (cualquier otro) no está definido: redirija todas las funciones de registro a console.log, ¡esto permite mantener esos registros!
window.console = { debug : window.console.log, ...};
No estoy seguro sobre el soporte de afirmación en varias versiones de IE, pero cualquier sugerencia es bienvenida. También publiqué esta respuesta aquí: ¿Cómo puedo usar el inicio de sesión de consola en Internet Explorer?
fuente
fuente
Trozo de consola en TypeScript:
fuente
Puede usar el siguiente para dar un grado adicional de seguro que tiene todas las bases cubiertas. Usar
typeof
primero evitará cualquierundefined
error. El uso===
también garantizará que el nombre del tipo sea en realidad la cadena "indefinida". Finalmente, querrá agregar un parámetro a la firma de la función (elegílogMsg
arbitrariamente) para garantizar la coherencia, ya que pasa lo que desee impreso a la consola a la función de registro. Esto también lo mantiene intellisense preciso y evita advertencias / errores en su IDE JS.fuente
Algunas veces la consola funcionará en IE8 / 9 pero fallará en otras ocasiones. Este comportamiento errático depende de si tiene abiertas herramientas de desarrollador y se describe en la pregunta de stackoverflow ¿IE9 admite console.log, y es una función real?
fuente
Se encontró un problema similar al ejecutar console.log en ventanas secundarias en IE9, creado por la función window.open.
Parece que en este caso la consola se define solo en la ventana principal y no está definida en las ventanas secundarias hasta que las actualice. Lo mismo se aplica a los hijos de ventanas infantiles.
Abordo este problema envolviendo el registro en la siguiente función (a continuación se muestra un fragmento del módulo)
fuente
Después de tener tantos problemas con esto (es difícil depurar el error ya que si abres la consola del desarrollador, ¡el error ya no ocurre!) Decidí crear un código excesivo para no tener que volver a molestarme con esto nunca más:
Personalmente, solo uso console.log y console.error, pero este código maneja todas las demás funciones como se muestra en la red de desarrolladores de Mozzila: https://developer.mozilla.org/en-US/docs/Web/API/console . Simplemente ponga ese código en la parte superior de su página y habrá terminado para siempre con esto.
fuente
Puede usar console.log (...) directamente en Firefox pero no en IE. En IE, debe usar window.console.
fuente