2010-09-22 17 views
24

Quelle solution recommandez-vous, la seconde est plus simple (moins de code), mais il y a des inconvénients à l'utiliser?js surcharger console.log si non défini

Première: (Définir un indicateur de débogage global)

// the first line of code 
var debug = true; 
try { 
    console.log 
} catch(e) { 
    if(e) { 
     debug=false; 
    } 
}; 
// Then later in the code 
if(debug) { 
    console.log(something); 
} 

Deuxième: override CONSOLE.LOG

try { 
    console.log 
} catch(e) { 
    if (e) { 
     console.log = function() {} 
    } 
}; 
// And all you need to do in the code is 
console.log(something); 

Répondre

53

Ni, mais une variante de la seconde. Perdre la try...catch et vérifier l'existence de l'objet de la console correctement:

if (typeof console == "undefined") { 
    window.console = { 
     log: function() {} 
    }; 
} 

console.log("whatever"); 
+1

Je présume que vous voulez faire soit 'this.console = ... 'ou' var console = ... '? Comme vous l'avez en ce moment, vous obtiendrez une erreur dans le mode strict d'ECMAScript 5. –

+1

@Tim: merci, c'était un oubli. Je pense que 'window.console' serait le meilleur pour la portabilité. –

+1

Portabilité dans le sens d'être en mesure de déplacer ce code dans une fonction, plutôt que la portabilité entre les environnements? –

3

EDIT:Andy's answer est bien plus élégante que le hack que j'ai posté ci-dessous.

J'utilise généralement cette approche ...

// prevent console errors on browsers without firebug 
if (!window.console) { 
    window.console = {}; 
    window.console.log = function(){}; 
} 
+1

J'aime votre version Frankie, mais je ne suis pas sûr que cela fonctionne en toute sécurité sur tous les navigateurs. Je me souviens de l'avoir utilisé et je rencontre toujours des problèmes avec l'une des versions d'IE, peut-être parce que l'objet 'console' n'est défini que lorsque la fenêtre de la console est ouverte dans IE9. Je pense que je devais faire un chèque «indéfini» comme le suggérait Andy E. –

+0

@Simon cela vient tard comme un commentaire, mais seulement vu aujourd'hui. La solution d'Andy est beaucoup plus élégante que ce hack rapide que j'ai posté. Vous devriez l'utiliser à la place. – Frankie

6

Ou, en coffeescript:

window.console ?= 
    log:-> #patch so console.log() never causes error even in IE. 
0

Ce qui suit va réaliser ce que vous cherchez g pour:

window.console && console.log('foo'); 
0
window.console = window.console || {}; 
window.console.log = window.console.log || function() {}; 
1

J'ai fait face à un bug similaire dans mon passé, et je surmonta avec le code ci-dessous:

if(!window.console) { 
    var console = { 
     log : function(){}, 
     warn : function(){}, 
     error : function(){}, 
     time : function(){}, 
     timeEnd : function(){} 
    } 
} 
+0

En quoi est-ce différent des réponses de Frankie ou Andy_E? –

+0

La réponse de Suresh est meilleure car il définit aussi d'autres méthodes qui ne seront pas définies avec log. Consultez https://developer.mozilla.org/en-US/docs/Web/API/Console pour une liste complète de toutes les fonctions qui peuvent (ou peuvent ne pas) être définies. –

+0

Cela ne fonctionnera pas si elle est appelée depuis une fonction. Au lieu de 'var console' il devrait être' window.console' ou juste 'console' –