2012-07-09 14 views

risposta

113

È possibile dirottare funzioni JavaScript nel seguente modo:

(function(){ 
    var oldLog = console.log; 
    console.log = function (message) { 
     // DO MESSAGE HERE. 
     oldLog.apply(console, arguments); 
    }; 
})(); 
  1. La linea 1 avvolge la funzione in una chiusura in modo che nessun'altra funzione abbia accesso diretto a oldLog (per motivi di manutenibilità).
  2. La riga 2 acquisisce il metodo originale.
  3. La riga 3 crea una nuova funzione.
  4. La riga 4 è dove si invia message al server.
  5. La riga 5 invoca il metodo originale come sarebbe stato gestito in origine.

apply viene utilizzato in modo che possiamo invocarlo suconsole utilizzando gli argomenti originali. Semplicemente chiamando oldLog(message) non riuscirebbe perché log dipende dalla sua associazione con console.


Aggiornamento commento di Per zzzzBov di seguito, in IE9 console.log non è in realtà una funzione così oldLog.apply fallirebbe. Vedi console.log.apply not working in IE9 per maggiori dettagli.

+1

[Il tuo codice presenterà problemi in IE perché 'console.log' non è in realtà un'istanza' Function' in IE] (http://stackoverflow.com/questions/5538972/console-log-apply-not-working- in-IE9). – zzzzBov

+0

@zzzzBov Interessante. Presumo che assegni 'console._oldLog = console.log; console._oldLog (messaggio); 'funzionerebbe, ma se' console' stesso è un oggetto ospitato, nessuna modifica è garantita da attaccare. Sfortunatamente, non ho IE per testarlo più. –

+0

sì, si potrebbe ancora chiamare '_oldLog' in questo modo. 'oldLog = Function.prototype.bind.call (console.log, console)' funziona con IE9 +, ma richiede un polyfill per 'Function.prototype.bind' per IE8 e versioni successive. – zzzzBov

16

Semplice:

function yourCustomLog(msg) { 
    //send msg via AJAX 
} 

window.console.log = yourCustomLog; 

si potrebbe desiderare di ignorare l'intera console oggetto di catturare console.info, console.warn e tale:

window.console = { 
    log = function(msg) {...}, 
    info = function(msg) {...}, 
    warn = function(msg) {...}, 
    //... 
} 
+0

Non è possibile utilizzare window.console = {...} perché window.console è una proprietà di sola lettura! – Luillyfe