Unterstützt IE9 console.log und ist es eine echte Funktion?

209

Unter welchen Umständen ist window.console.login Internet Explorer 9 definiert?

Auch wenn window.console.logdefiniert window.console.log.applyund window.console.log.callundefiniert sind. Warum ist das?

[Verwandte Frage zu IE8: Was ist mit console.log in IE8 passiert? .]

mloughran
quelle
3
Schauen Sie sich diesen großartigen Beitrag über die Feinheiten des IE8-9-Konsolenobjekts / der Funktion an: whattheheadsaid.com/2011/04/…
Marc Climent
@MarcCliment der Link ist tot
Chakeda
@chakeda Ich hasse es, wenn dies passiert, gibt es den Link aus dem Webarchiv: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Antworten:

299

In Internet Explorer 9 (und 8) wird das consoleObjekt nur angezeigt, wenn die Entwicklertools für eine bestimmte Registerkarte geöffnet werden. Wenn Sie das Entwickler-Tool-Fenster für diese Registerkarte ausblenden, consolebleibt das Objekt für jede Seite, zu der Sie navigieren, verfügbar. Wenn Sie eine neue Registerkarte öffnen, müssen Sie auch die Entwicklertools für diese Registerkarte öffnen, damit das consoleObjekt verfügbar gemacht wird.

Das consoleObjekt ist nicht Teil eines Standards und eine Erweiterung des Dokumentobjektmodells. Wie andere DOM-Objekte wird es als Host-Objekt betrachtet und Objectmuss weder von Functionnativen ECMAScript-Funktionen und -Objekten erben noch von diesen Methoden erben . Dies ist der Grund applyund callfür diese Methoden nicht definiert. In IE 9 wurden die meisten DOM-Objekte verbessert, um von nativen ECMAScript-Typen zu erben. Da die Entwicklertools als Erweiterung des Internet Explorer (wenn auch als integrierte Erweiterung) betrachtet werden, haben sie eindeutig nicht die gleichen Verbesserungen wie der Rest des DOM erhalten.

Für das, was es wert ist, können Sie immer noch einige Function.prototypeMethoden auf consoleMethoden mit ein wenig bind()Magie anwenden:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Andy E.
quelle
2
Gleiches gilt für das consoleObjekt von Firebug .
Marcel Korpel
150
Ich kann nicht stolz sagen, dass ich in den vielen Jahren, die ich für das Web entwickelt habe, davon ausgegangen bin, dass console.log von allen gängigen Browsern unterstützt wird. Ich habe gerade einen Tag damit verbracht herauszufinden, warum IE9 mein Skript nicht mag und jetzt weiß ich warum - es hatte im ersten Schritt ein console.log. Das Debuggen ist unmöglich, da durch das Aktivieren des Debug-Modus dieser Fehler sofort behoben wurde: P Vielen Dank für die Klarstellung!
f055
2
Hatte gestern das gleiche Problem. Die Installation von DebugBar hat mir schneller geholfen, da das Konsolenobjekt nicht definiert wird. Als ich die IE-Konsole, aber nicht die DebugBar versteckte, erhielt ich eine Nachricht von letzterer, dass ein JavaScript-Fehler aufgetreten ist (Konsole ist nicht definiert).
Simon A. Eugster
Sie sollten das Fehlerprotokoll beim ersten Mal überprüft haben, als das Problem auf IE @ f055
Lucky Ali
7
Internetoptionen -> Erweitert -> Zeigt eine Benachrichtigung über jeden Skriptfehler an. Webentwickler sollten dies immer im IE aktiviert lassen. Dies hätte Sie über die Konsole oder die undefinierte Protokollfunktion informiert. Ich kann mich nicht genau an die Nachricht erinnern.
Seth Flowers
166

Eine einfache Lösung für dieses Problem mit console.log besteht darin, am Anfang Ihres JS-Codes Folgendes zu definieren:

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

Dies funktioniert bei mir in allen Browsern. Dadurch wird eine Dummy-Funktion für console.log erstellt, wenn der Debugger nicht aktiv ist. Wenn der Debugger aktiv ist, wird die Methode console.log definiert und normal ausgeführt.

Michael Erickson
quelle
8
Weitere Informationen und robustere Konsolenersatzprodukte (einschließlich anderer Konsolenmethoden) finden Sie hier: stackoverflow.com/questions/8002116/…
Zach Lysobey
@ZachL: Welche genau in Beton?
hakre
Meine Antwort hat einen Ansatz: stackoverflow.com/a/15771110/363701 . Überprüfen Sie dies auch: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey
13

Ich weiß, dass dies eine sehr alte Frage ist, aber ich bin der Meinung, dass dies eine wertvolle Alternative zum Umgang mit dem Konsolenproblem darstellt. Platzieren Sie den folgenden Code vor jedem Aufruf der Konsole. * (Also Ihr erstes Skript).

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

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

Steven Anderson
quelle
10

console.log wird nur definiert, wenn die Konsole geöffnet ist. Wenn Sie in Ihrem Code danach suchen möchten, stellen Sie sicher, dass Sie in der Fenstereigenschaft danach suchen

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

Dies löst eine Ausnahme in IE9 aus und funktioniert nicht richtig. Mach das nicht

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

Nachdem ich den Artikel aus dem obigen Kommentar von Marc Cliament gelesen habe, habe ich jetzt meine universelle Cross-Browser-Funktion console.log so geändert:

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
quelle
1
JustFunction.prototype.apply.call(console.log, console, arguments);
Victor
@ Victor es sollte definitiv die einzige akzeptierte Antwort sein!
Pavel Frankov
0

Ich möchte erwähnen, dass IE9 den Fehler nicht auslöst, wenn Sie console.log mit Entwicklertools verwenden, die auf allen Windows-Versionen geschlossen sind. Unter XP ist dies der Fall, unter Windows 7 jedoch nicht. Wenn Sie die Unterstützung für WinXP im Allgemeinen eingestellt haben, können Sie console.log direkt verwenden.

Paolo Mioni
quelle
-1

Wie wäre es mit...

console = { log : function(text) { alert(text); } }
Deckenfisch
quelle
1
Dies kann in einigen Fällen eine passable Problemumgehung sein, aber Sie haben die Frage nicht wirklich beantwortet.
Pswg