objetos log javascript logging internet-explorer-9

log - javascript window console



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

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

Incluso cuando se define window.console.log.apply , window.console.log.apply y window.console.log.call no están definidos. ¿Por qué es esto?

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


Después de leer el artículo del comentario de Marc Cliament anterior, ahora he cambiado la función de mi navegador multiusos console.log para tener este aspecto:

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


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

El objeto de la console no forma parte de ningún estándar y es una extensión del Modelo de objetos de documento. Al igual que otros objetos DOM, se considera un objeto host y no se requiere que herede de Object , ni sus métodos de Function , como lo hacen las funciones y objetos nativos de ECMAScript. Esta es la razón por la que se apply y las call no están definidas en esos métodos. En IE 9, la mayoría de los objetos DOM se mejoraron para heredar de los tipos de 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, todavía puedes usar algunos métodos Function.prototype métodos de console con un poco de bind() magic:

var log = Function.prototype.bind.call(console.log, console); log.apply(console, ["this", "is", "a", "test"]); //-> "thisisatest"


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 lo hace, pero en Windows 7 no lo hace. Entonces, si abandonaste el soporte para WinXP en general, estás bien usando console.log directamente.


Qué tal si...

console = { log : function(text) { alert(text); } }


Sé que esta es una pregunta muy antigua pero creo que esto 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í es 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


Una solución simple para este problema de console.log es definir lo siguiente al principio 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.


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 lanza una excepción en IE9 y no funcionará correctamente. No hagas esto

if (console) console.log(msg)