O IE9 suporta console.log e é uma função real?

209

Em que circunstâncias é window.console.logdefinida no Internet Explorer 9?

Mesmo quando window.console.logdefinido window.console.log.applye window.console.log.callindefinido. Por que é isso?

[Pergunta relacionada ao IE8: O que aconteceu com o console.log no IE8? .]

mloughran
fonte
3
Confira este ótimo post sobre os meandros do objeto / função do console IE8-9
Marc Climent
@MarcCliment o link está morto
chakeda
@chakeda Eu odeio quando isso acontece, há o link do arquivo da web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Respostas:

299

No Internet Explorer 9 (e 8), o consoleobjeto é exposto apenas quando as ferramentas do desenvolvedor são abertas para uma guia específica. Se você ocultar a janela de ferramentas do desenvolvedor para essa guia, o consoleobjeto permanecerá exposto para cada página em que você navegar. Se você abrir uma nova guia, também deverá abrir as ferramentas do desenvolvedor para essa guia para que o consoleobjeto seja exposto.

O consoleobjeto não faz parte de nenhum padrão e é uma extensão do Modelo de Objeto do Documento. Como outros objetos DOM, ele é considerado um objeto host e não é necessário herdar Object, nem seus métodos Function, como as funções e objetos nativos do ECMAScript. Esse é o motivo applye não callestá definido nesses métodos. No IE 9, a maioria dos objetos DOM foi aprimorada para herdar dos tipos nativos de ECMAScript. Como as ferramentas do desenvolvedor são consideradas uma extensão do IE (embora uma extensão interna), elas claramente não receberam as mesmas melhorias que o restante do DOM.

Pelo que vale a pena, você ainda pode usar alguns Function.prototypemétodos em consolemétodos com um pouco de bind()mágica:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Andy E
fonte
2
O mesmo vale para o consoleobjeto do Firebug .
Marcel Korpel
150
Posso dizer com orgulho que, durante muitos anos que desenvolvi para a Web, presumi que o console.log é suportado por todos os principais navegadores. Passei um dia trabalhando por que o IE9 não gosta do meu script e agora eu sei o porquê - ele tinha um console.log na primeira etapa. Impossível depurar, já que ao ativar o modo de depuração, esse bug desapareceu em um instante: P Obrigado pelo esclarecimento !!
f055 16/07/12
2
Teve o mesmo problema ontem. A instalação do DebugBar aconteceu para me ajudar mais rapidamente, pois ele não define o objeto do console. Portanto, quando ocultei o console do IE, mas não o DebugBar, recebi uma mensagem deste último informando que havia um erro de JavaScript (o console não está definido).
Simon A. Eugster
você deveria ter verificado o log de erros na primeira vez em que o problema ocorreu com o IE @ f055 #
Lucky Ali
7
Opções da Internet -> Avançado -> Exibe uma notificação sobre cada erro de script. Os desenvolvedores da Web devem sempre deixar isso marcado no IE. Isso o informaria sobre o console ou a função de log sendo indefinida ... não consigo lembrar exatamente a mensagem.
Seth Flowers
166

Uma solução simples para esse problema do console.log é definir o seguinte no início do seu código JS:

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

Isso funciona para mim em todos os navegadores. Isso cria uma função fictícia para console.log quando o depurador não está ativo. Quando o depurador está ativo, o método console.log é definido e é executado normalmente.

Michael Erickson
fonte
8
Mais informações e substituições de console mais robustas (incluindo outros métodos de console) aqui: stackoverflow.com/questions/8002116/…
Zach Lysobey
@ZachL: Quais são os concretos com precisão?
hakre
Minha resposta tem uma abordagem: stackoverflow.com/a/15771110/363701 . Também verifique isso: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey
13

Sei que essa é uma pergunta muito antiga, mas sinto que isso adiciona uma alternativa valiosa de como lidar com o problema do console. Coloque o código a seguir antes de qualquer chamada para o console. * (Para o seu primeiro 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;
        }
    }
}());

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

Steven Anderson
fonte
10

console.log é definido apenas quando o console está aberto. Se você deseja procurá-lo em seu código, verifique-o na propriedade window

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

isso lança uma exceção no IE9 e não funcionará corretamente. Não faça isso

if (console) 
    console.log(msg)
John
fonte
6

Depois de ler o artigo do comentário de Marc Cliament acima, agora alterei minha função console.log para todos os fins, para vários navegadores, para ficar assim:

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
fonte
1
ApenasFunction.prototype.apply.call(console.log, console, arguments);
Victor
@ Victor definitivamente deve ser a única resposta aceita!
Pavel Frankov 11/03/2015
0

Gostaria de mencionar que o IE9 não gera o erro se você usar o console.log com as ferramentas de desenvolvedor fechadas em todas as versões do Windows. No XP, sim, mas no Windows 7, não. Portanto, se você largou o suporte ao WinXP em geral, poderá usar o console.log diretamente.

Paolo Mioni
fonte
-1

E se...

console = { log : function(text) { alert(text); } }
Ceilingfish
fonte
1
Isso pode ser uma solução aceitável em alguns casos, mas você realmente não resolveu a questão.
PSWG