web-dev-qa-db-fra.com

IE9 supporte-t-il console.log, et est-ce une vraie fonction?

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? .]

205
mloughran

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"
297
Andy E

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.

165
Michael Erickson

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

13
Steven Anderson

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)
10
John

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);
        }
    }
}
6
James Ford

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.

0
Paolo Mioni