Dans quelles circonstances window.console.log
est-il défini dans Internet Explorer 9?
Même lorsque window.console.log
est défini, window.console.log.apply
et window.console.log.call
ne sont pas définis. Pourquoi est-ce?
[Question connexe pour IE8: Qu'est-il arrivé à console.log dans IE8? .]
Dans Internet Explorer 9 (et 8), l'objet console
est uniquement exposé lorsque les outils de développement sont ouverts pour un onglet particulier. Si vous masquez la fenêtre des outils de développement pour cet onglet, l'objet console
reste exposé pour chaque page vers laquelle vous accédez. Si vous ouvrez un nouvel onglet, vous devez également ouvrir les outils de développement de cet onglet pour que l'objet console
soit exposé.
L'objet console
ne fait partie d'aucune norme et constitue une extension du modèle d'objet de document. Comme d'autres objets DOM, il est considéré comme un objet hôte et il n'est pas nécessaire d'hériter de Object
, ni ses méthodes de Function
, contrairement aux objets et fonctions ECMAScript natifs. C'est la raison pour laquelle apply
et call
sont indéfinis sur ces méthodes. Dans IE 9, la plupart des objets DOM ont été améliorés pour hériter des types ECMAScript natifs. Les outils de développement étant considérés comme une extension de IE (bien qu’une extension intégrée), ils n’ont manifestement pas bénéficié des mêmes améliorations que le reste du DOM.
Pour ce que cela vaut, vous pouvez toujours utiliser des méthodes Function.prototype
sur des méthodes console
avec un peu bind()
magic:
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Une solution simple à ce problème console.log consiste à définir les éléments suivants au début de votre code JS:
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };
Cela fonctionne pour moi dans tous les navigateurs. Cela crée une fonction factice pour console.log lorsque le débogueur n'est pas actif. Lorsque le débogueur est actif, la méthode console.log est définie et s'exécute normalement.
Je sais que la question est très ancienne, mais j’ai le sentiment que cela ajoute une alternative précieuse à la manière de traiter le problème de la console. Placez le code suivant avant tout appel à la console. * (Donc votre tout premier script).
// 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;
}
}
}());
Référence:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js
console.log n'est défini que lorsque la console est ouverte. Si vous voulez le vérifier dans votre code, assurez-vous de le vérifier dans la propriété window
if (window.console)
console.log(msg)
cela lève une exception dans IE9 et ne fonctionnera pas correctement. Ne faites pas cela
if (console)
console.log(msg)
Après avoir lu l'article du commentaire de Marc Cliament ci-dessus, j'ai maintenant changé ma fonction multi-navigateur console.log à tout usage pour qu'elle ressemble à ceci:
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);
}
}
}
Je voudrais mentionner que IE9 ne génère pas l'erreur si vous utilisez console.log avec des outils de développement fermés sur toutes les versions de Windows. Sur XP c'est le cas, mais sous Windows 7, il ne fait pas . Ainsi, si vous ne gérez plus le support de WinXP, vous pourrez utiliser console.log directement.