383 Stimmen

console' ist ein undefinierter Fehler für Internet Explorer

Ich verwende Firebug und habe einige Anweisungen wie:

console.log("...");

auf meiner Seite. Im IE8 (wahrscheinlich auch in früheren Versionen) erhalte ich Skriptfehler, die besagen, dass "console" undefiniert ist. Ich habe versucht, dies an den Anfang meiner Seite zu setzen:

<script type="text/javascript">
    if (!console) console = {log: function() {}};
</script>

Ich erhalte immer noch die Fehler. Gibt es eine Möglichkeit, die Fehler zu beseitigen?

378voto

kennytm Punkte 488916

Versuchen Sie

if (!window.console) console = ...

Eine undefinierte Variable kann nicht direkt referenziert werden. Alle globalen Variablen sind jedoch gleichnamige Attribute des globalen Kontexts ( window im Falle von Browsern), und der Zugriff auf ein nicht definiertes Attribut ist in Ordnung.

Oder verwenden Sie if (typeof console === 'undefined') console = ... wenn Sie die magische Variable vermeiden wollen window siehe @Tim Down's Antwort .

324voto

Peter Tseng Punkte 12727

Fügen Sie den folgenden Text am Anfang Ihres JavaScript ein (bevor Sie die Konsole verwenden):

/**
 * Protect window.console method calls, e.g. console is not defined on IE
 * unless dev tools are open, and IE doesn't define console.debug
 * 
 * Chrome 41.0.2272.118: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 * Firefox 37.0.1: log,info,warn,error,exception,debug,table,trace,dir,group,groupCollapsed,groupEnd,time,timeEnd,profile,profileEnd,assert,count
 * Internet Explorer 11: select,log,info,warn,error,debug,assert,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd,trace,clear,dir,dirxml,count,countReset,cd
 * Safari 6.2.4: debug,error,log,info,warn,clear,dir,dirxml,table,trace,assert,count,profile,profileEnd,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd
 * Opera 28.0.1750.48: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 */
(function() {
  // Union of Chrome, Firefox, IE, Opera, and Safari console methods
  var methods = ["assert", "cd", "clear", "count", "countReset",
    "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed",
    "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd",
    "select", "table", "time", "timeEnd", "timeStamp", "timeline",
    "timelineEnd", "trace", "warn"];
  var length = methods.length;
  var console = (window.console = window.console || {});
  var method;
  var noop = function() {};
  while (length--) {
    method = methods[length];
    // define undefined methods as noops to prevent errors
    if (!console[method])
      console[method] = noop;
  }
})();

Die Umhüllung des Funktionsabschlusses dient dazu, die Variablen in den Anwendungsbereich zu bringen, damit keine Variablen definiert werden. Dies schützt sowohl vor undefinierten console und undefiniert console.debug (und andere fehlende Methoden).

EDITAR: Ich habe festgestellt, dass HTML5 Boilerplate verwendet ähnlichen Code in der Datei js/plugins.js, wenn Sie eine Lösung suchen, die (wahrscheinlich) auf dem neuesten Stand gehalten wird.

73voto

Tim Down Punkte 304837

Eine weitere Alternative ist die typeof Betreiber:

if (typeof console == "undefined") {
    this.console = {log: function() {}};
}

Eine weitere Alternative ist die Verwendung einer Protokollierungsbibliothek, wie z.B. meine eigene log4javascript .

47voto

Vinícius Moraes Punkte 3456

Für eine robustere Lösung verwenden Sie dieses Stück Code (aus dem Quellcode von Twitter):

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

13voto

iblamefish Punkte 4613

In meinen Skripten verwende ich entweder die Kurzform:

window.console && console.log(...) // only log if the function exists

oder, wenn es nicht möglich oder machbar ist, jede console.log-Zeile zu bearbeiten, erstelle ich eine falsche Konsole:

// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing. 
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X