Estou usando o Firebug e tenho algumas instruções como:
console.log("...");
na minha página. No IE8 (provavelmente versões anteriores também), recebo erros de script dizendo que 'console' é indefinido. Tentei colocar isso no topo da minha página:
<script type="text/javascript">
if (!console) console = {log: function() {}};
</script>
ainda recebo os erros. Alguma maneira de se livrar dos erros?
typeof
no seu if, ele evitará erros indefinidos:if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Respostas:
Tentar
Uma variável indefinida não pode ser referida diretamente. No entanto, todas as variáveis globais são atributos com o mesmo nome do contexto global (
window
no caso de navegadores) e acessar um atributo indefinido é bom.Ou use
if (typeof console === 'undefined') console = ...
se você quiser evitar a variável mágicawindow
, consulte a resposta de @Tim Down .fonte
<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>
no topo da sua página! Obrigado Kenny.var console = console || { log: function() {} };
window
:var console = window.console || { log: function() {} };
Cole o seguinte na parte superior do seu JavaScript (antes de usar o console):
O wrapper de fechamento da função é o escopo das variáveis para não definir nenhuma variável. Isso protege contra indefinido
console
e indefinidoconsole.debug
(e outros métodos ausentes).EDIT: notei que o HTML5 Boilerplate usa código semelhante em seu arquivo js / plugins.js, se você estiver procurando por uma solução que (provavelmente) seja mantida atualizada.
fonte
Outra alternativa é o
typeof
operador:Outra alternativa é usar uma biblioteca de log, como meu próprio log4javascript .
fonte
var
? Isso apenas confundiria as coisas aqui. Ou você quer dizer atribuir aowindow.console
invés deconsole
?var
. Por que isso confundiria as coisas aqui?typeof
é garantido para retornar uma string e"undefined"
é uma string. Quando os dois operandos são do mesmo tipo==
e===
são especificados para executar exatamente as mesmas etapas. O usotypeof x == "undefined"
é uma maneira sólida de testar sex
está indefinido em qualquer escopo e em qualquer ambiente compatível com ECMAScript 3.Para uma solução mais robusta, use este trecho de código (extraído do código-fonte do twitter):
fonte
Nos meus scripts, eu uso a abreviação:
ou, se não for possível ou possível editar todas as linhas do console.log, eu crio um console falso:
fonte
if(!console) {console = {} ; console.log = function(){};}
!window.console && (window.console = { log: function () { } });
Você pode usar
console.log()
se tiverDeveloper Tools
aberto o IE8 e também usar aConsole
caixa de texto na guia Script.fonte
fonte
this
se referewindow
.Com base em duas respostas anteriores de
e as documentações para
Aqui está uma implementação de melhor esforço para o problema, ou seja, se existe um console.log que realmente existe, ele preenche as lacunas de métodos inexistentes via console.log.
Por exemplo, para o IE6 / 7, você pode substituir o registro por alerta (estúpido, mas funciona) e incluir o monstro abaixo (eu o chamei de console.js): [Sinta-se à vontade para remover comentários como achar melhor, eu os deixei para referência, um minimizador pode resolvê-los]:
e console.js:
fonte
methods.hasOwnProperty(method) &&
no loop for.> x = { a: 1, b: 2}
->Object {a: 1, b: 2}
efor(var f in x) {console.log(f + " " + x[f]);} 'end'
->a 1 b 2 "end"
. Portanto, um objeto anônimo criado não possui nenhuma propriedade adicional emethods
é criado apenas antes dofor
loop. É possível hackear o que foi dito acima?var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}
Você nunca sabe o que uma biblioteca fez com os objetos na cadeia de herança do objeto com o qual está trabalhando. Assim, a recomendação das ferramentas de qualidade de código javascript, como jshint e jslint, deve ser usadahasOwnProperty
.No IE9, se o console não estiver aberto, este código:
mostrará "objeto", mas esse código
lançará a exceção TypeError, mas não retornará valor indefinido;
Portanto, a versão garantida do código será semelhante a esta:
fonte
Estou usando apenas console.log no meu código. Então eu incluo um forro 2 muito curto
fonte
Percebeu que o OP está usando o Firebug com o IE, então suponha que seja o Firebug Lite . Esta é uma situação descolada, pois o console é definido no IE quando a janela do depurador é aberta, mas o que acontece quando o Firebug já está em execução? Não tenho certeza, mas talvez o método "firebugx.js" possa ser uma boa maneira de testar nesta situação:
fonte:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
(links atualizados em 12/2014)
fonte
Estou usando o fauxconsole ; Modifiquei um pouco o css para que pareça melhor, mas funcione muito bem.
fonte
Para depuração no IE, confira este log4javascript
fonte
Para suporte ao IE8 ou console limitado ao console.log (sem depuração, rastreamento, ...), você pode fazer o seguinte:
Se console OU console.log indefinido: Crie funções fictícias para funções do console (rastreio, depuração, log, ...)
window.console = { debug : function() {}, ...};
Caso contrário, se console.log estiver definido (IE8) E console.debug (qualquer outro) não estiver definido: redirecione todas as funções de log para console.log, isso permitirá manter esses logs!
window.console = { debug : window.console.log, ...};
Não tenho certeza sobre o suporte de declaração em várias versões do IE, mas todas as sugestões são bem-vindas. Também postou esta resposta aqui: Como posso usar o log do console no Internet Explorer?
fonte
fonte
Esboço do console no TypeScript:
fonte
Você pode usar o abaixo para dar um grau extra de seguro de que você tem todas as bases cobertas. Usar
typeof
primeiro evitaráundefined
erros. O uso===
também garantirá que o nome do tipo seja realmente a sequência "indefinida". Por fim, convém adicionar um parâmetro à assinatura da função (eu escolhilogMsg
arbitrariamente) para garantir consistência, pois você passa o que deseja imprimir no console para a função de log. Isso também mantém o intellisense preciso e evita avisos / erros no seu IDE ciente de JS.fonte
Às vezes, o console funciona no IE8 / 9, mas falha em outros momentos. Esse comportamento irregular depende se você possui ferramentas de desenvolvedor abertas e está descrito na pergunta stackoverflow O IE9 suporta console.log e é uma função real?
fonte
Foi encontrado um problema semelhante ao executar console.log nas janelas filho no IE9, criado pela função window.open.
Parece que, nesse caso, o console é definido apenas na janela pai e é indefinido nas janelas filho até que você as atualize. O mesmo se aplica a filhos de janelas filho.
Eu lido com esse problema envolvendo o logon na próxima função (abaixo está o fragmento do módulo)
fonte
Depois de ter tantos problemas com essa coisa (é difícil depurar o erro, pois se você abrir o console do desenvolvedor, o erro não acontece mais!) Decidi criar um código de exagero para nunca mais me preocupar com isso:
Pessoalmente, eu só uso console.log e console.error, mas esse código lida com todas as outras funções, como mostrado na Mozzila Developer Network: https://developer.mozilla.org/en-US/docs/Web/API/console . Basta colocar esse código no topo da sua página e você estará pronto para sempre.
fonte
Você pode usar o console.log (...) diretamente no Firefox, mas não no IEs. No IEs, você precisa usar o window.console.
fonte