web-dev-qa-db-fra.com

Test des instructions console.log dans IE

Duplicata possible:
'console' est une erreur non définie pour Internet Explorer

Si tu as console.log instructions dans votre code, Internet Explorer générera une erreur JavaScript (au moins dans IE7, ce que nos utilisateurs intranet ont installé).

J'utilise Firefox pour la plupart de mes tests de développement principalement en raison des fonctionnalités fournies par Firebug (où j'utilise beaucoup d'instructions de console) mais je dois également tester dans IE.

si j'ajoute ce qui suit à mon JavaScript, l'erreur ne se déclenche pas.

var debugging = false;
if (typeof console == "undefined") 
    var console = { log: function() {} };  

Le problème est que je voudrais déclencher un événement si le mode de débogage est faux. Si je crée une fonction pour tester si le débogage est faux et faire une action (à ce stade, juste une alerte), mais lorsque j'essaie de faire ce qui suit, je reçois une erreur IE disant La console n'est pas définie .

var debugging = false; // or true   
if (typeof console == "undefined") 
    var console = { log: function() {consoleMsg()} };   

function consoleMsg() {
    if(!debugging) {
    alert('Console.log event in Production Code');
}   

Si quelqu'un pouvait m'aider à corriger mon code, fournir une meilleure façon de m'aider à atteindre mon objectif ou me diriger vers une ressource pour m'éduquer, je serais très reconnaissant.

46
Michael BW

Vous n'avez pas à sauter à travers tous ces cerceaux. Vérifiez simplement si la console existe avant de l'utiliser.

Donc, au lieu de:

console.log('foo');

Utilisation:

window.console && console.log('foo');

... et vous n'aurez aucune erreur.


Alternativement, vous pouvez simplement le vérifier en haut de votre script, et s'il n'est pas défini, remplissez-le simplement avec une fonction vide:

// At the top of your script:
if ( ! window.console ) console = { log: function(){} };
// If you use other console methods, add them to the object literal above

// Then, anywhere in your script:
console.log('This message will be logged, but will not cause an error in IE7');

Pour une solution plus robuste, utilisez ce morceau de code (extrait du code source de Twitter):

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

"console" elle-même doit être une fonction, ainsi que "journal". Alors:

if(typeof(console) === 'undefined') {
    console = function(){};
    console.log = function(){consoleMsg()};
}   
5
graphicdivine

As-tu essayé try-catch:

var debugging = false; // or true 
try {  
    console.log();
} catch(ex) {
    /*var*/ console = { log: function() {consoleMsg()} };   
}
2
Bhesh Gurung
(function(debug) {
    var console;

    function wrapConsoleMethod(fnName) {
        if(fnName in console)
            console[ fnName ] = function(fn) {
                return function() {
                    if(debug)
                        return fn.apply(console, arguments);
                    else
                        alert('Console event in Production Code');
                };
            }(console[ fnName ]);
        else
            ; // fn not in console
    };

    if(!('console' in window))
        window.console = {
            log : function() {}
            // ...
        };
    console = window.console;
    wrapConsoleMethod('log');
    // ...
})(true /* debug */);

console.log('test');
1
Saxoier