¿IE9 es compatible con console.log, y es una función real?

209

¿En qué circunstancias es window.console.log define en Internet Explorer 9?

Incluso cuando window.console.logse define, window.console.log.applyywindow.console.log.call no está definido. ¿Por qué es esto?

[Pregunta relacionada para IE8: ¿Qué pasó con console.log en IE8? .]

mloughran
fuente
3
Echa un vistazo a esta gran publicación sobre las complejidades del objeto / función de la consola IE8-9
Marc Climent
@MarcCliment el enlace está muerto
chakeda
@chakeda Odio cuando esto sucede, está el enlace del archivo web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Respuestas:

299

En Internet Explorer 9 (y 8), el consoleobjeto solo se expone cuando las herramientas de desarrollador se abren para una pestaña en particular. Si oculta la ventana de herramientas del desarrollador para esa pestaña, el consoleobjeto permanece expuesto para cada página a la que navega. Si abre una pestaña nueva, también debe abrir las herramientas de desarrollador para esa pestaña para queconsole objeto quede expuesto.

El consoleobjeto no forma parte de ningún estándar y es una extensión del Modelo de Objetos del Documento. Al igual que otros objetos DOM, se considera un objeto host y no se requiere que herede Object, ni sus métodos Function, como lo hacen las funciones y objetos ECMAScript nativos. Esta es la razón applyy callno están definidos en esos métodos. En IE 9, la mayoría de los objetos DOM se mejoraron para heredar de tipos ECMAScript nativos. Como las herramientas de desarrollo se consideran una extensión de IE (aunque sea una extensión incorporada), claramente no recibieron las mismas mejoras que el resto del DOM.

Para lo que vale, aún puede usar algunos Function.prototypemétodos en consolemétodos con un poco de bind()magia:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Andy E
fuente
2
Lo mismo es cierto para el consoleobjeto de Firebug .
Marcel Korpel
150
Puedo decir con orgullo que durante los muchos años que desarrollé para la web supuse que console.log es compatible con todos los principales navegadores. Acabo de pasar un día averiguando por qué a IE9 no le gusta mi script y ahora sé por qué: tenía un console.log en el primer paso. Imposible de depurar, ya que activar el modo de depuración hizo que este error desapareciera en un instante: P ¡Gracias por aclararlo!
f055
2
Tuve el mismo problema ayer. La instalación de DebugBar me ayudó más rápido, ya que no define el objeto de la consola. Entonces, cuando escondí la consola de IE pero no la DebugBar, recibí un mensaje de este último de que había un error de JavaScript (la consola no está definida).
Simon A. Eugster
debería haber comprobado el registro de errores la primera vez que se le ocurrió el problema en IE @ f055
Lucky Ali
77
Opciones de Internet -> Avanzado -> Mostrar una notificación sobre cada error de script. Los desarrolladores web siempre deben dejar esto marcado en IE. Esto le habría informado sobre la consola, o la función de registro no está definida ... no puedo recordar el mensaje exactamente.
Seth Flowers
166

Una solución simple a este problema de console.log es definir lo siguiente al comienzo de su código JS:

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

Esto funciona para mí en todos los navegadores. Esto crea una función ficticia para console.log cuando el depurador no está activo. Cuando el depurador está activo, el método console.log se define y se ejecuta normalmente.

Michael Erickson
fuente
8
Más información y reemplazos de consola más robustos (incluidos otros métodos de consola) aquí: stackoverflow.com/questions/8002116/…
Zach Lysobey
@ZachL: ¿Cuáles en concreto precisamente?
Hakre
Mi respuesta tiene un enfoque: stackoverflow.com/a/15771110/363701 . También mira
Zach Lysobey
13

Sé que esta es una pregunta muy antigua, pero creo que agrega una alternativa valiosa de cómo lidiar con el problema de la consola. Coloque el siguiente código antes de cualquier llamada a la consola. * (Así que su primer script).

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

Referencia:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js

Steven Anderson
fuente
10

console.log solo se define cuando la consola está abierta. Si desea verificarlo en su código, asegúrese de verificarlo dentro de la propiedad de la ventana

if (window.console)
    console.log(msg)

Esto arroja una excepción en IE9 y no funcionará correctamente. No hagas esto

if (console) 
    console.log(msg)
Juan
fuente
6

Después de leer el artículo del comentario anterior de Marc Cliament, ahora he cambiado mi función multipropósito console.log de navegador cruzado para que se vea así:

function log()
{
    "use strict";

    if (typeof(console) !== "undefined" && console.log !== undefined)
    {
        try
        {
            console.log.apply(console, arguments);
        }
        catch (e)
        {
            var log = Function.prototype.bind.call(console.log, console);
            log.apply(console, arguments);
        }
    }
}
James Ford
fuente
1
JustFunction.prototype.apply.call(console.log, console, arguments);
Victor
¡@Victor definitivamente debería ser la única respuesta aceptada!
Pavel Frankov
0

Me gustaría mencionar que IE9 no genera el error si usa console.log con herramientas de desarrollador cerradas en todas las versiones de Windows. En XP sí, pero en Windows 7 no. Entonces, si dejó de admitir WinXP en general, está bien usando console.log directamente.

Paolo Mioni
fuente
-1

Qué tal si...

console = { log : function(text) { alert(text); } }
Pez techo
fuente
1
Esto podría ser una solución pasable en algunos casos, pero en realidad no ha abordado la pregunta.
pswg