IE9 supporta console.log ed è una funzione reale?


209

In quali circostanze è window.console.logdefinito in Internet Explorer 9?

Anche quando window.console.logè definito window.console.log.applye window.console.log.callnon definito. Perchè è questo?

[Domanda relativa a IE8: cosa è successo a console.log in IE8? .]


3
Dai un'occhiata a questo fantastico post sulla complessità dell'oggetto / funzione della console IE8-9
Marc Climent,


@MarcCliment il link è morto
chakeda

@chakeda Odio quando questo accade, c'è il link dall'archivio web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Risposte:


299

In Internet Explorer 9 (e 8), l' consoleoggetto è esposto solo quando gli strumenti di sviluppo sono aperti per una determinata scheda. Se nascondi la finestra degli strumenti di sviluppo per quella scheda, l' consoleoggetto rimane esposto per ogni pagina a cui vai. Se apri una nuova scheda, devi anche aprire gli strumenti di sviluppo per quella scheda affinché l' consoleoggetto sia esposto.

L' consoleoggetto non fa parte di alcuno standard ed è un'estensione del Document Object Model. Come altri oggetti DOM, è considerato un oggetto host e non è tenuto a ereditarne Objectné i suoi metodi Function, come fanno le funzioni e gli oggetti ECMAScript nativi. Questo è il motivo applye callnon sono definiti su questi metodi. In IE 9, la maggior parte degli oggetti DOM è stata migliorata per ereditare dai tipi ECMAScript nativi. Poiché gli strumenti di sviluppo sono considerati un'estensione di IE (sebbene, un'estensione integrata), chiaramente non hanno ricevuto gli stessi miglioramenti del resto del DOM.

Per quello che vale, puoi ancora usare alcuni Function.prototypemetodi su consolemetodi con un po 'di bind()magia:

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

2
Lo stesso vale per l' consoleoggetto di Firebug .
Marcel Korpel,

150
Posso dire con orgoglio che per i molti anni che ho sviluppato per il web ho assunto console.log è supportato da tutti i principali browser. Ho appena trascorso una giornata a capire perché IE9 non mi piace la mia sceneggiatura e ora so perché - aveva un console.log nel primo passo. Impossibile eseguire il debug, poiché l'attivazione della modalità debug ha fatto sparire questo bug in un istante: P Grazie per il chiarimento !!
f055,

2
Ho avuto lo stesso problema ieri. L'installazione di DebugBar mi è stata di aiuto più rapidamente poiché non definisce l'oggetto console. Quindi, quando ho nascosto la console IE ma non la DebugBar ho ricevuto un messaggio da quest'ultimo che c'era un errore JavaScript (la console non è definita).
Simon A. Eugster,

avresti dovuto controllare il registro degli errori la prima volta che il problema è stato riscontrato su IE @ f055
Lucky Ali,

7
Opzioni Internet -> Avanzate -> Visualizza una notifica su ogni errore di script. Gli sviluppatori Web dovrebbero sempre lasciare questo controllo in IE. Questo ti avrebbe informato della console o della funzione di registro non definita ... non ricordo esattamente il messaggio.
Seth Flowers,

166

Una soluzione semplice a questo problema console.log è definire quanto segue all'inizio del codice JS:

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

Questo funziona per me in tutti i browser. Ciò crea una funzione fittizia per console.log quando il debugger non è attivo. Quando il debugger è attivo, il metodo console.log viene definito ed eseguito normalmente.


8
Maggiori informazioni e più robusti sostituzioni console (inclusi altri metodi di console) qui: stackoverflow.com/questions/8002116/...
Zach Lysobey

@ZachL: Quali in concreto precisamente?
Hacre,

La mia risposta ha un approccio: stackoverflow.com/a/15771110/363701 .
Dai

13

So che questa è una domanda molto vecchia, ma credo che ciò aggiunga una valida alternativa a come affrontare il problema della console. Inserisci il seguente codice prima di qualsiasi chiamata alla console. * (Quindi il tuo primo 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;
        }
    }
}());

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


10

console.log è definito solo quando la console è aperta. Se vuoi controllarlo nel tuo codice, assicurati di cercarlo nella proprietà della finestra

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

questo genera un'eccezione in IE9 e non funzionerà correttamente. Non farlo

if (console) 
    console.log(msg)

6

Dopo aver letto l'articolo del commento di Marc C Parliament sopra, ora ho cambiato la mia funzione console.log multi-browser per apparire così:

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

1
SoloFunction.prototype.apply.call(console.log, console, arguments);
Victor,

@Victor dovrebbe sicuramente essere l'unica risposta accettata!
Pavel Frankov,

0

Vorrei menzionare che IE9 non genera l'errore se si utilizza console.log con strumenti di sviluppo chiusi su tutte le versioni di Windows. Su XP lo fa, ma su Windows 7 no. Quindi, se hai abbandonato il supporto per WinXP in generale, stai bene usando direttamente console.log.


-1

Che ne dite di...

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

1
Questa potrebbe essere una soluzione alternativa in alcuni casi, ma in realtà non hai affrontato la domanda.
pswg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.