2010-09-22 8 views
24

Quale soluzione consigliate, la seconda è più semplice (meno codice), ma ci sono degli svantaggi nell'usarlo?js sovrascrive console.log se non definito

Primo: (Impostare un flag di debug globale)

// 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); 
} 

Secondo: 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); 

risposta

53

Né, ma una variante della seconda. Perdere la try...catch e verificare l'esistenza dell'oggetto console correttamente:

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

console.log("whatever"); 
+1

Presumibilmente si sia vuole fare 'this.console = ... 'o' var console = ... '? Come al momento, si verificherebbe un errore nella modalità rigorosa ECMAScript 5. –

+1

@Tim: grazie, è stata una svista. Penso che 'window.console' sarebbe la soluzione migliore per la portabilità. –

+1

Portabilità nel senso di essere in grado di spostare questo codice in una funzione, piuttosto che la portabilità tra gli ambienti? –

3

EDIT:Andy's answer è il modo più elegante che l'hack veloce che ho postato qui sotto.

Io generalmente uso di questo approccio ...

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

Mi piace la tua versione Frankie, ma non sono sicuro che funzioni in modo sicuro su tutti i browser. Ricordo di averlo usato e ho riscontrato problemi occasionali con una delle versioni di IE, forse perché l'oggetto 'console' viene definito solo quando la finestra della console è aperta in IE9. Penso di dover fare un assegno "indefinito" come suggeriva Andy E. –

+0

@Simon questo arriva in ritardo come un commento ma lo ha visto solo oggi. La soluzione di Andy è molto più elegante di questo trucco veloce che ho pubblicato. Dovresti invece usarlo. – Frankie

6

O, in CoffeeScript:

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

Quanto segue otterrà quello che stai cercando g per:

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

Ho affrontato un bug simile nel mio passato, e ho superato con il codice qui sotto:

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

Come è diverso da Frankie o Andy_E? –

+0

La risposta di Suresh è migliore in quanto sta anche definendo altri metodi che non saranno definiti insieme al log. Controlla https://developer.mozilla.org/en-US/docs/Web/API/Console per un elenco completo di tutte le funzioni che possono (o non possono) essere definite. –

+0

Questo non funzionerà se viene chiamato da una funzione. Invece di 'var console' dovrebbe essere' window.console' o solo 'console' –