IE9 prend-il en charge console.log et est-ce une vraie fonction?

209

Dans quelles circonstances est window.console.logdéfini dans Internet Explorer 9?

Même lorsqu'il window.console.logest défini window.console.log.applyet window.console.log.calln'est pas défini. Pourquoi est-ce?

[Question connexe pour IE8: Qu'est-il arrivé à console.log dans IE8? .]

mloughran
la source
3
Découvrez cet excellent article sur les subtilités de l'objet / fonction de la console IE8-9
Marc Climent
@MarcCliment le lien est mort
chakeda
@chakeda Je déteste quand cela arrive, il y a le lien à partir des archives web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Réponses:

299

Dans Internet Explorer 9 (et 8), l' consoleobjet n'est exposé que 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' consoleobjet reste exposé pour chaque page vers laquelle vous naviguez. Si vous ouvrez un nouvel onglet, vous devez également ouvrir les outils de développement de cet onglet pour que l' consoleobjet soit exposé.

L' consoleobjet ne fait partie d'aucune norme et est une extension du modèle d'objet de document. Comme les autres objets DOM, il est considéré comme un objet hôte et n'est pas tenu d'hériter Objectni de ses méthodes Function, comme le font les fonctions et les objets ECMAScript natifs. C'est la raison applyet calln'est pas définie sur ces méthodes. Dans IE 9, la plupart des objets DOM ont été améliorés pour hériter des types ECMAScript natifs. Comme les outils de développement sont considérés comme une extension d'IE (quoique, une extension intégrée), ils n'ont clairement pas reçu les mêmes améliorations que le reste du DOM.

Pour ce que ça vaut, vous pouvez toujours utiliser certaines Function.prototypeméthodes sur des consoleméthodes avec un peu de bind()magie:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Andy E
la source
2
Il en va de même pour l' consoleobjet de Firebug .
Marcel Korpel
150
Je peux dire sans fierté que pendant les nombreuses années que j'ai développées pour le Web, j'ai supposé que console.log est pris en charge par tous les principaux navigateurs. Je viens de passer une journée à comprendre pourquoi IE9 n'aime pas mon script et maintenant je sais pourquoi - il avait un console.log à la toute première étape. Impossible de déboguer, car l'activation du mode débogage a fait disparaître ce bug en un instant: P Merci pour la clarification !!
f055
2
J'ai eu le même problème hier. L'installation de DebugBar m'a aidé plus rapidement car elle ne définit pas l'objet console. Donc, quand j'ai caché la console IE mais pas la DebugBar, j'ai reçu un message de ce dernier qu'il y avait une erreur JavaScript (la console n'est pas définie).
Simon A. Eugster
vous devriez avoir vérifié le journal des erreurs à la toute première fois que le problème vous est apparu sur IE @ f055
Lucky Ali
7
Options Internet -> Avancé -> Afficher une notification sur chaque erreur de script. Les développeurs Web doivent toujours laisser cette case cochée dans IE. Cela vous aurait informé de la console ou de la fonction de journalisation non définie ... je ne me souviens pas exactement du message.
Seth Flowers
166

Une solution simple à ce problème console.log consiste à définir ce qui suit 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.

Michael Erickson
la source
8
Plus d'informations et des remplacements de consoles plus robustes (y compris d'autres méthodes de consoles) ici: stackoverflow.com/questions/8002116/…
Zach Lysobey
@ZachL: Lesquels en béton précisément?
hakre
Ma réponse a une approche: stackoverflow.com/a/15771110/363701 . Consultez également ceci: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey
13

Je sais que c'est une très vieille question, mais je pense que cela ajoute une alternative valable sur la façon 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

Steven Anderson
la source
10

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)
John
la source
6

Après avoir lu l'article du commentaire de Marc Cliament ci-dessus, j'ai maintenant changé ma fonction console.log multi-navigateur multi-usage pour ressembler à 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);
        }
    }
}
James Ford
la source
1
JustFunction.prototype.apply.call(console.log, console, arguments);
Victor
@Victor, cela devrait certainement être la seule réponse acceptée!
Pavel Frankov
0

Je voudrais mentionner que IE9 ne soulève pas l'erreur si vous utilisez console.log avec des outils de développement fermés sur toutes les versions de Windows. Sous XP, c'est le cas, mais pas sous Windows 7. Donc, si vous avez abandonné la prise en charge de WinXP en général, vous pouvez utiliser directement console.log directement.

Paolo Mioni
la source
-1

Que diriez-vous...

console = { log : function(text) { alert(text); } }
Ceilingfish
la source
1
Cela peut être une solution de contournement passable dans certains cas, mais vous n'avez pas réellement répondu à la question.
pswg