¿Qué pasó con console.log en IE8?

Resuelto leeand00 asked hace 15 años • 17 respuestas

Según esta publicación , ¿estaba en la versión beta, pero no en la versión?

leeand00 avatar Mar 27 '09 22:03 leeand00
Aceptado

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) }
}
Mister Lucky avatar Mar 27 '2009 15:03 Mister Lucky

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() {};
     }
   }

jpswain avatar May 11 '2011 16:05 jpswain

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.messagesmatriz 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 argumentsobjeto. 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 messagepara 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.rawque 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 .

Walter Stabosz avatar Jan 09 '2013 20:01 Walter Stabosz

Vale la pena señalar que console.logen IE8 no es una verdadera función de Javascript. No es compatible con los métodos applyo call.

James Wheare avatar Aug 11 '2009 18:08 James Wheare