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



tag p title (5)

Depois de ler o artigo do comentário de Marc Cliament acima, agora mudei a minha função console.log cross-browser multiuso 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);
        }
    }
}

Em quais circunstâncias o window.console.log é definido no Internet Explorer 9?

Mesmo quando window.console.log é definido, window.console.log.apply e window.console.log.call são indefinidos. Por que é isso?

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


Answer #1

E se...

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

Answer #2

Gostaria de mencionar que o IE9 não aumenta o erro se você usar o console.log com ferramentas de desenvolvedor fechadas em todas as versões do Windows. No XP ele faz, mas no Windows 7 não. Então, se você abandonar o suporte para WinXP em geral, você está bem usando console.log diretamente.


Answer #3

No Internet Explorer 9 (e 8), o objeto de console é 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 objeto do console 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 objeto do console seja exposto.

O objeto de console não faz parte de nenhum padrão e é uma extensão do Modelo de Objeto de Documento. Como outros objetos DOM, ele é considerado um objeto de host e não é necessário herdar de Object , nem seus métodos de Function , como as funções e objetos nativos do ECMAScript. Esta é a razão pela qual apply e call são indefinidos nesses métodos. No IE 9, a maioria dos objetos DOM foi melhorada para herdar dos tipos nativos do 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.

Por que vale a pena, você ainda pode usar alguns métodos Function.prototype em métodos de console com uma pequena mágica bind() :

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

Answer #4

Uma solução simples para este 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.





internet-explorer-9