wake-up-neo.net

Internet Explorer: "Konsole ist nicht definiert" Fehler

Ich habe console.log() in einem JavaScript verwendet, das ich geschrieben habe, und ein Fehler von: console is not defined wurde im Internet Explorer ausgelöst (hat in anderen Browsern problemlos funktioniert).

Ich habe es ersetzt durch:

if (console) console.log("...");

Wenn consoleundefined ist, würde ich erwarten, dass die Bedingung als false ausgewertet wird. Ergo würde die Anweisung console.log nicht ausgeführt und sollte keinen Fehler auslösen.

Stattdessen wird der Fehler console is not defined at character 4 ausgegeben.

Ist das ein IE Fehler? Oder ist diese "Wenn" -Bedingung wirklich illegal? Es scheint absurd, denn wenn if (console) illegal ist, sollte if (console==undefined) auch illegal sein.

Wie soll auf undefined Variablen geprüft werden?

23
matteo

Wenn console selbst überhaupt nicht vorhanden ist, wird ein Fehler ausgegeben, weil Sie auf eine nicht definierte Variable zugreifen. Genau wie if(abc) {} wirft einen Fehler.

Da sich console in window befindet und window does immer vorhanden ist, sollte dies funktionieren:

if(window.console) ...

Grundsätzlich ist der Zugriff auf eine Eigenschaft , die nicht existiert, kostenlos und gibt keinen Fehler aus (er wird nur in undefined ausgewertet, wobei die if-Bedingung nicht erfüllt wird). Es ist jedoch illegal, auf eine nicht deklarierte Variable zuzugreifen.

25
pimvdb

Andere Antworten gaben Ihnen die Ursache. Es gibt jedoch eine bessere Lösung, als if vor jedem Aufruf von console.* zu verwenden.

Fügen Sie dies (einmal) hinzu, bevor Sie eines Ihrer Skripte einfügen, die console verwenden:

//Ensures there will be no 'console is undefined' errors
window.console = window.console || (function(){
    var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){};
    return c;
})();

Dadurch wird nur dann eine "Pseudo" -Konsole erstellt, wenn sie nicht vorhanden ist, sodass die Fehler "Konsole ist undefiniert" nicht mehr auftreten und Sie nicht jedes Mal nachfragen müssen, ob die Konsole vorhanden ist. Mit diesem Befehl rufen Sie einfach console.log oder eine beliebige Konsolenmethode an einem beliebigen Ort auf, ohne Probleme.

Hoffe das hilft. Prost

in Internet Explorer ist das Konsolenobjekt nicht wirklich definiert, es sei denn, Ihre Entwicklerwerkzeuge sind zum Zeitpunkt des Ladens des Fensters geöffnet.

um das Problem zu beheben, packen Sie alle Konsolenausdrucke in eine if-Anweisung ein:

if (typeof window.console !== 'undefined') {
    ...
}

sie müssen auch jede Seite aktualisieren, nachdem Sie die Entwicklertools geöffnet haben, um die Konsolendrucke anzuzeigen. <3 IE

7
jbabey

Dies ist eine lustige Sache über nicht deklarierte Variablen. Die JS-Engine versucht, die Variable in eine Eigenschaft von window aufzulösen. Also normalerweise foo == window.foo.

Wenn diese Eigenschaft jedoch nicht vorhanden ist, wird ein Fehler ausgegeben.

alert(foo); // Syntax error: foo is not defined

(Sollte "foo nicht deklariert " imho sein, aber wie auch immer.) Dieser Fehler tritt nicht auf, wenn Sie explizit auf die Eigenschaft des Fensters verweisen:

alert(window.foo); // undefined

... oder diese Variable deklarieren:

var foo;
alert(foo); // undefined

... oder zur Initialisierung verwenden:

foo = 1; // window.foo = 1

Das Merkwürdige ist, dass der Operator typeof auch diesen Fehler verhindert:

alert(typeof foo); // "undefined"

Zusammenfassend: Sie können nicht deklarierte Variablen in Ausdrücken nur verwenden, wenn eine window-Eigenschaft mit demselben Namen vorhanden ist oder Sie sie als Operand von typeof verwenden. In Ihrem Beispiel existiert window.console nicht und es gibt keine var-Deklaration. Deshalb bekommst du einen Fehler.

4

Wie wäre es damit? Ich habe es nicht probiert

if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
3
Chetter Hummin

Bearbeiten von @ yckarts Antwort

Die Verwendung von c.length als Eingabe für eine Funktion, die c definiert, funktioniert nicht. Außerdem ordnen Sie mit noop nur Elemente im Array neu zu, wenn Sie window.console Methoden hinzufügen sollten.

(function(w){
  var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
  noop = function () {};

  w.console = w.console || (function (len) {
    var ret = {};
    while (len--) { ret[c[len]] = noop; }
    return ret;
  }(c.length));
})(window);
1
Sam Carrington

Einige Browser haben console nicht aktiviert, wenn die Dev-Tools geschlossen werden. Dieses Problem könnte auch bei WebViews oder iFrames auftreten, bei denen die Konsole deaktiviert ist.

Der Fehler in diesen Fällen lautet - Uncaught ReferenceError: console is not defined

Inspiriert durch viele Antworten hier, entwickelte ich eine Bibliothek für diese Anwendung: https://github.com/sunnykgupta/jsLogger

Eigenschaften:

  1. Es überschreibt sicher die console.log.
  2. Kümmert sich darum, wenn die Konsole nicht verfügbar ist (ach ja, Sie müssen das auch berücksichtigen.)
  3. Speichert alle Protokolle (auch wenn sie unterdrückt werden), um sie später abzurufen.
  4. Verarbeitet wichtige Konsolenfunktionen wie log, warn, error, info.
0
Sunny R Gupta

Inspiriert von @Edgar Villegas Alvaradoanswer , komplettierte die Methoden und machte es ein bisschen einfacher:

(function(w){
  var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
  noop = function () {};

  w.console = w.console || (function (len) {
    var ret = {};
    while (len--) { ret[c[len]] = noop; }
    return ret;
  }(c.length));
})(window);

Bearbeitet, um es in eine IIFE zu setzen und einen Syntaxfehler zu beheben!

0
yckart

Sie können die folgenden Angaben verwenden, um einen zusätzlichen Versicherungsschutz zu geben, dass Sie alle Grundlagen haben. Wenn Sie zuerst typeof verwenden, werden undefined-Fehler vermieden. Durch die Verwendung von === wird auch sichergestellt, dass der Name des Typs tatsächlich die Zeichenfolge "undefined" ist. Schließlich möchten Sie der Funktionssignatur einen Parameter hinzufügen (ich wählte logMsg willkürlich), um die Konsistenz sicherzustellen, da Sie alles, was Sie an die Konsole drucken möchten, an die Protokollfunktion übergeben. Dadurch bleiben Sie auch auf dem neuesten Stand und vermeiden Warnungen/Fehler in Ihrer JS-fähigen IDE.

if(!window.console || typeof console === "undefined") {
  var console = { log: function (logMsg) { } };
}
0
Flak DiNenno