web-dev-qa-db-fra.com

Internet Explorer: "la console n'est pas définie" Erreur

J'utilisais console.log() dans certains scripts JavaScript que j'ai écrits et une erreur de: console is not defined a été générée dans Internet Explorer (fonctionne correctement dans d'autres navigateurs).

Je l'ai remplacé par:

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

Si console est undefined, je m'attendrais à ce que la condition soit évaluée à false. Ainsi, l'instruction console.log ne serait pas exécutée et ne devrait pas générer d'erreur.

Au lieu de cela, une erreur de: console is not defined at character 4 est renvoyée.

Est-ce un bogue IE? Ou est-ce que la condition "si" est vraiment illégale? Cela semble absurde, car si if (console) est illégale, alors if (console==undefined) devrait l'être également.

Comment êtes-vous censé vérifier les variables undefined?

23
matteo

Si console lui-même n'existe pas du tout, une erreur est générée, car vous accédez à une variable non définie. Tout comme if(abc) {} génère une erreur.

Puisque console réside dans window et que window existe existe toujours, cela devrait fonctionner:

if(window.console) ...

En gros, accéder à une propriété qui n'existe pas est gratuit et ne génère pas d'erreur (la valeur est simplement undefined, la condition if échouant). Cependant, il est illégal d’accéder à une variable non déclarée variable .

25
pimvdb

D'autres réponses vous ont donné la cause première… Cependant. Il existe une meilleure solution que d'utiliser if avant tout appel à console.*

Ajoutez ceci (une fois) avant d'inclure l'un de vos scripts utilisant la console:

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

Cela créera une console 'pseudo' uniquement si elle n'existe pas, de sorte que les erreurs 'console is undefined' disparaîtront et vous n'aurez plus à demander si la console existe à chaque fois . Avec cela, vous appelez simplement console.log ou n'importe quelle méthode de console n'importe où, sans problèmes.

J'espère que cela aide .

31

dans Internet Explorer, l'objet console n'est pas défini, à moins que vos outils de développement soient ouverts au moment du chargement de la fenêtre.

pour résoudre votre problème, encapsulez toutes vos impressions de console dans une instruction if:

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

vous devez également actualiser chaque page après avoir ouvert les outils de développement afin de voir les impressions de la console. <3 IE

7
jbabey

C'est une chose amusante à propos des variables non déclarées. Le moteur JS tente de résoudre la variable en une propriété de window. Donc d'habitude, foo == window.foo.

Mais si cette propriété n'existe pas, une erreur est générée.

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

(Doit être "foo n'est pas déclaré " à mon humble avis, mais peu importe.) Cette erreur ne se produit pas lorsque vous explicitement faites référence à la propriété de la fenêtre:

alert(window.foo); // undefined

... ou déclarer cette variable:

var foo;
alert(foo); // undefined

... ou utilisez-le pour l'initialisation:

foo = 1; // window.foo = 1

La chose étrange est que l'opérateur typeof empêche également cette erreur:

alert(typeof foo); // "undefined"

Donc, pour résumer, vous ne pouvez pas utiliser de variables non déclarées dans des expressions sauf s'il existe une propriété de window avec le même nom ou si vous l'utilisez comme opérande de typeof. Dans votre exemple, window.console n'existe pas et il n'y a pas de déclaration var. C'est pourquoi vous obtenez une erreur.

4
user123444555621

Que dis-tu de ça? Je n'ai pas encore essayé

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

Edit de @ yckart's answer

Utiliser c.length comme entrée dans une fonction qui définit c ne fonctionnera pas. De plus, vous ne faites que réaffecter des éléments du tableau avec noop alors que vous devriez ajouter des méthodes à window.console.

(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

La console n'est pas activée dans certains navigateurs lorsque les outils de développement sont fermés. De plus, on pourrait rencontrer ce problème avec WebViews ou iFrames où la console est désactivée.

L'erreur dans ces cas est - Uncaught ReferenceError: console is not defined

Inspiré par de nombreuses réponses, ici, j'ai développé une bibliothèque pour ce cas d'utilisation: https://github.com/sunnykgupta/jsLogger

Caractéristiques:

  1. Il remplace en toute sécurité le fichier console.log.
  2. Prend soin de vous si la console n'est pas disponible (oh oui, vous devez aussi en tenir compte.)
  3. Stocke tous les journaux (même s'ils sont supprimés) pour une récupération ultérieure.
  4. Gère les fonctions principales de la console telles que log, warn, error, info.
0
Sunny R Gupta

Inspiré par -Edgar Villegas Alvaradoanswer , a complété les méthodes et simplifié un peu les choses:

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

Édité pour mettre dans un IIFE et corriger une erreur de syntaxe!

0
yckart

Vous pouvez utiliser les éléments ci-dessous pour donner un degré d'assurance supplémentaire couvrant toutes les bases. Utiliser typeof en premier évitera les erreurs undefined. L'utilisation de === permettra également de s'assurer que le nom du type est bien la chaîne "indéfini". Enfin, vous voudrez ajouter un paramètre à la signature de la fonction (j'ai choisi logMsg de façon arbitraire) pour assurer la cohérence, puisque vous transmettez à la console tout ce que vous voulez imprimer sur la fonction de journal. Cela vous permet également de garder intellisense précis et d’éviter les avertissements/erreurs dans votre IDE compatible JS.

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