webentwicklung-frage-antwort-db.com.de

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

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

Selbst wenn window.console.log definiert ist, sind window.console.log.apply und window.console.log.call nicht definiert. Warum ist das?

[Zugehörige Frage zu IE8: Was ist mit Console.log in IE8 passiert? .]

205
mloughran

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

Das console-Objekt ist kein Bestandteil eines Standards und ist eine Erweiterung des Document Object Model. Wie andere DOM-Objekte wird es als Host-Objekt betrachtet und muss nicht von Object sowie seinen Methoden von Function erben, wie es native ECMAScript-Funktionen und -Objekte tun. Aus diesem Grund sind apply und call für diese Methoden undefiniert. In IE 9 wurden die meisten DOM-Objekte verbessert, um von nativen ECMAScript-Typen zu erben. Da die Entwicklertools als eine Erweiterung von IE (wenn auch als integrierte Erweiterung) betrachtet werden, haben sie offensichtlich nicht die gleichen Verbesserungen wie der Rest des DOM erhalten. 

Für was es wert ist, können Sie noch einige Function.prototype-Methoden auf console-Methoden mit etwas bind() magic anwenden:

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

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

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

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

165

Ich weiß, dass dies eine sehr alte Frage ist, fühlt sich dadurch jedoch eine wertvolle Alternative für den Umgang mit dem Konsolenproblem an. Fügen Sie vor jedem Aufruf der Konsole den folgenden Code ein. * (Also Ihr allererstes 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

13
Steven Anderson

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

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

dies löst eine Ausnahme in IE9 aus und wird nicht korrekt funktionieren. Mach das nicht

if (console) 
    console.log(msg)
10
John

Nachdem ich den Artikel aus dem Kommentar von Marc Cliament gelesen hatte, habe ich nun meine Allzweck-Cross-Browser-Konsole.log-Funktion so geändert, dass sie wie folgt aussieht:

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);
        }
    }
}
6
James Ford

Ich möchte erwähnen, dass IE9 den Fehler nicht auslöst, wenn Sie console.log mit Entwicklertools verwenden, die in 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.

0
Paolo Mioni