¿Qué pasó con console.log en IE8?
Según esta publicación , ¿estaba en la versión beta, pero no en la versión?
console.log solo está disponible después de haber abierto las Herramientas de desarrollo (F12 para alternar entre abrir y cerrar). Lo curioso es que después de abrirlo, puedes cerrarlo y luego seguir publicando en él a través de llamadas de console.log, y se verán cuando lo vuelvas a abrir. Estoy pensando que es una especie de error y que puede solucionarse, pero ya veremos.
Probablemente usaré algo como esto:
function trace(s) {
if ('console' in self && 'log' in console) console.log(s)
// the line below you might want to comment out, so it dies silent
// but nice for seeing when the console is available or not.
else alert(s)
}
y aún más simple:
function trace(s) {
try { console.log(s) } catch (e) { alert(s) }
}
Aún mejor como respaldo es esto:
var alertFallback = true;
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
if (alertFallback) {
console.log = function(msg) {
alert(msg);
};
} else {
console.log = function() {};
}
}
Esta es mi opinión sobre las diversas respuestas. Realmente quería ver los mensajes registrados, incluso si no tenía la consola de IE abierta cuando fueron activados, así que los introduje en una console.messages
matriz que creo. También agregué una función console.dump()
para facilitar la visualización del registro completo. console.clear()
vaciará la cola de mensajes.
Esta solución también "maneja" los otros métodos de la Consola (que creo que todos se originan en la API de la Consola Firebug )
Finalmente, esta solución tiene la forma de IIFE , por lo que no contamina el ámbito global. El argumento de la función alternativa se define en la parte inferior del código.
Simplemente lo coloco en mi archivo JS maestro que se incluye en cada página y me olvido de él.
(function (fallback) {
fallback = fallback || function () { };
// function to trap most of the console functions from the FireBug Console API.
var trap = function () {
// create an Array from the arguments Object
var args = Array.prototype.slice.call(arguments);
// console.raw captures the raw args, without converting toString
console.raw.push(args);
var message = args.join(' ');
console.messages.push(message);
fallback(message);
};
// redefine console
if (typeof console === 'undefined') {
console = {
messages: [],
raw: [],
dump: function() { return console.messages.join('\n'); },
log: trap,
debug: trap,
info: trap,
warn: trap,
error: trap,
assert: trap,
clear: function() {
console.messages.length = 0;
console.raw.length = 0 ;
},
dir: trap,
dirxml: trap,
trace: trap,
group: trap,
groupCollapsed: trap,
groupEnd: trap,
time: trap,
timeEnd: trap,
timeStamp: trap,
profile: trap,
profileEnd: trap,
count: trap,
exception: trap,
table: trap
};
}
})(null); // to define a fallback function, replace null with the name of the function (ex: alert)
Alguna información adicional
La línea var args = Array.prototype.slice.call(arguments);
crea una matriz a partir del arguments
objeto. Esto es necesario porque argumentos no es realmente un Array .
trap()
es un controlador predeterminado para cualquiera de las funciones API. Paso los argumentos a message
para que obtenga un registro de los argumentos que se pasaron a cualquier llamada API (no solo a console.log
).
Editar
Agregué una matriz adicional console.raw
que captura los argumentos exactamente como se pasan a trap()
. Me di cuenta de que args.join(' ')
estaba convirtiendo objetos a cadenas, "[object Object]"
lo que a veces puede ser indeseable. Gracias bfontaine por la sugerencia .
Vale la pena señalar que console.log
en IE8 no es una verdadera función de Javascript. No es compatible con los métodos apply
o call
.