J'utilise Firebug et j'ai quelques déclarations comme:
console.log("...");
dans ma page. Dans IE8 (probablement les versions antérieures aussi), je reçois des erreurs de script disant que la «console» n'est pas définie. J'ai essayé de mettre cela en haut de ma page:
<script type="text/javascript">
if (!console) console = {log: function() {}};
</script>
je reçois toujours les erreurs. Une façon de se débarrasser des erreurs?
typeof
dans votre if, cela évitera les erreurs non définies:if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Réponses:
Essayer
Une variable non définie ne peut pas être référencée directement. Cependant, toutes les variables globales sont des attributs du même nom du contexte global (
window
dans le cas des navigateurs), et l'accès à un attribut non défini est correct.Ou utilisez
if (typeof console === 'undefined') console = ...
si vous voulez éviter la variable magiquewindow
, voir la réponse de @Tim Down .la source
<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>
le en haut de votre page! Merci Kenny.var console = console || { log: function() {} };
window
:var console = window.console || { log: function() {} };
Collez ce qui suit en haut de votre JavaScript (avant d'utiliser la console):
L'encapsuleur de fermeture de fonction consiste à délimiter les variables de manière à ne définir aucune variable. Cela protège à la fois indéfini
console
et indéfiniconsole.debug
(et d'autres méthodes manquantes).EDIT: J'ai remarqué que HTML5 Boilerplate utilise un code similaire dans son fichier js / plugins.js, si vous cherchez une solution qui sera (probablement) maintenue à jour.
la source
Une autre alternative est l'
typeof
opérateur:Encore une autre alternative consiste à utiliser une bibliothèque de journalisation, comme mon propre log4javascript .
la source
var
? Cela ne ferait qu'embrouiller les choses ici. Ou voulez-vous dire assigner àwindow.console
plutôt queconsole
?var
. Pourquoi cela confondrait-il les choses ici?typeof
est garanti pour renvoyer une chaîne et"undefined"
est une chaîne. Lorsque les deux opérandes sont du même type==
et===
sont spécifiés pour effectuer exactement les mêmes étapes. L'utilisationtypeof x == "undefined"
est un moyen solide de tester si un domainex
n'est pas défini et n'importe quel environnement conforme à ECMAScript 3.Pour une solution plus robuste, utilisez ce morceau de code (extrait du code source de twitter):
la source
Dans mes scripts, j'utilise soit la sténographie:
ou, s'il n'est pas possible ou faisable d'éditer chaque ligne console.log, je crée une fausse console:
la source
if(!console) {console = {} ; console.log = function(){};}
!window.console && (window.console = { log: function () { } });
Vous pouvez utiliser
console.log()
si vous avezDeveloper Tools
ouvert dans IE8 et vous pouvez également utiliser laConsole
zone de texte sur l'onglet de script.la source
la source
this
fait référencewindow
.Basé sur deux réponses précédentes de
et les documentations pour
Voici une implémentation au mieux pour le problème, ce qui signifie que s'il existe un console.log qui existe réellement, il comble les lacunes pour les méthodes non existantes via console.log.
Par exemple pour IE6 / 7, vous pouvez remplacer la journalisation par une alerte (stupide mais fonctionne), puis inclure le monstre ci-dessous (je l'ai appelé console.js): [N'hésitez pas à supprimer les commentaires comme bon vous semble, je les ai laissés pour référence, un minimiseur peut les résoudre]:
et console.js:
la source
methods.hasOwnProperty(method) &&
de la boucle for.> x = { a: 1, b: 2}
->Object {a: 1, b: 2}
etfor(var f in x) {console.log(f + " " + x[f]);} 'end'
->a 1 b 2 "end"
. Ainsi, un objet anonyme créé n'a pas de propriété supplémentaire etmethods
est juste créé avant lafor
boucle. Est-il possible de pirater ce qui précède?var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}
Vous ne savez jamais ce qu'une bibliothèque a fait aux objets de la chaîne d'héritage de l'objet avec lequel vous travaillez. Ainsi la recommandation par des outils de qualité de code javascript comme jshint et jslint à utiliserhasOwnProperty
.Dans IE9, si la console n'est pas ouverte, ce code:
affichera "objet", mais ce code
lancera une exception TypeError, mais ne renverra pas de valeur non définie;
Ainsi, la version garantie du code ressemblera à ceci:
la source
J'utilise uniquement console.log dans mon code. J'inclus donc une doublure très courte
la source
Vous avez remarqué que OP utilise Firebug avec IE, alors supposez que c'est Firebug Lite . C'est une situation géniale car la console est définie dans IE lorsque la fenêtre du débogueur est ouverte, mais que se passe-t-il lorsque Firebug est déjà en cours d'exécution? Pas sûr, mais la méthode "firebugx.js" peut être un bon moyen de tester dans cette situation:
la source:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
(liens mis à jour 12/2014)
la source
J'utilise une fausse console ; J'ai un peu modifié le CSS pour qu'il soit plus joli mais fonctionne très bien.
la source
Pour le débogage dans IE, consultez ce log4javascript
la source
Pour IE8 ou la prise en charge de la console limitée à console.log (pas de débogage, trace, ...), vous pouvez effectuer les opérations suivantes:
Si console OU console.log non défini: créer des fonctions factices pour les fonctions de la console (trace, débogage, journal, ...)
window.console = { debug : function() {}, ...};
Sinon si console.log est défini (IE8) ET console.debug (tout autre) n'est pas défini: redirigez toutes les fonctions de journalisation vers console.log, cela permet de conserver ces journaux!
window.console = { debug : window.console.log, ...};
Je ne suis pas sûr de la prise en charge assert dans diverses versions d'IE, mais toutes les suggestions sont les bienvenues. A également publié cette réponse ici: Comment puis-je utiliser la journalisation de la console dans Internet Explorer?
la source
la source
Stub de console en TypeScript:
la source
Vous pouvez utiliser ce qui suit pour donner un degré supplémentaire d'assurance que toutes vos bases sont couvertes. L'utilisation en
typeof
premier évitera touteundefined
erreur. L'utilisation===
garantit également que le nom du type est bien la chaîne "non définie". Enfin, vous voudrez ajouter un paramètre à la signature de la fonction (j'ai choisilogMsg
arbitrairement) pour assurer la cohérence, car vous transmettez tout ce que vous voulez imprimer à la console à la fonction de journal. Cela vous permet également de garder l'intellisense précis et d'éviter tout avertissement / erreur dans votre IDE compatible JS.la source
Parfois, la console fonctionne dans IE8 / 9 mais échoue à d'autres moments. Ce comportement erratique dépend de l'ouverture des outils de développement et est décrit dans la question stackoverflow. IE9 prend-il en charge console.log et s'agit-il d'une fonction réelle?
la source
Problème similaire rencontré lors de l'exécution de console.log dans les fenêtres enfants dans IE9, créé par la fonction window.open.
Il semble que dans ce cas, la console est définie uniquement dans la fenêtre parent et n'est pas définie dans les fenêtres enfants jusqu'à ce que vous les actualisiez. Il en va de même pour les enfants des fenêtres enfants.
Je traite ce problème en encapsulant le journal dans la fonction suivante (ci-dessous est un fragment de module)
la source
Après avoir eu tellement de problèmes avec cette chose (il est difficile de déboguer l'erreur car si vous ouvrez la console développeur, l'erreur ne se produit plus!) J'ai décidé de créer un code excessif pour ne plus jamais avoir à vous soucier de cela:
Personnellement, je n'utilise que console.log et console.error, mais ce code gère toutes les autres fonctions comme indiqué dans le Mozzila Developer Network: https://developer.mozilla.org/en-US/docs/Web/API/console . Mettez simplement ce code en haut de votre page et vous en aurez fini pour toujours.
la source
Vous pouvez utiliser console.log (...) directement dans Firefox mais pas dans les IE. Dans les IE, vous devez utiliser window.console.
la source