2012-07-09 28 views

Respuesta

113

Puede secuestrar funciones JavaScript de la siguiente manera:

(function(){ 
    var oldLog = console.log; 
    console.log = function (message) { 
     // DO MESSAGE HERE. 
     oldLog.apply(console, arguments); 
    }; 
})(); 
  1. La línea 1 envuelve su función en un cierre para que ninguna otra función tenga acceso directo a oldLog (por motivos de mantenimiento).
  2. La línea 2 captura el método original.
  3. La línea 3 crea una nueva función.
  4. Línea 4 es donde envía message a su servidor.
  5. La línea 5 invoca el método original tal como se hubiera manejado originalmente.

apply se utiliza para que podamos invocarlo en console utilizando los argumentos originales. Simplemente llamando al oldLog(message) fallaría porque log depende de su asociación con console.


actualización comentario de zzzzBov por debajo, en IE9 console.log no es realmente una función de modo oldLog.apply fracasarían. Vea console.log.apply not working in IE9 para más detalles.

+1

[Su código tendrá problemas en IE porque 'console.log' no es realmente una instancia' Function' en IE] (http://stackoverflow.com/questions/5538972/console-log-apply-not-working- in-ie9). – zzzzBov

+0

@zzzzBov Interesante. Asumo asignar 'console._oldLog = console.log; console._oldLog (message); 'funcionaría, pero si' console' en sí mismo es un objeto alojado, no se garantiza que se mantengan los cambios. Desafortunadamente, ya no tengo IE para probar esto. –

+0

sí, aún puedes llamar a '_oldLog' así. 'oldLog = Function.prototype.bind.call (console.log, console)' funciona para IE9 +, pero luego necesita un polyfill para 'Function.prototype.bind' para IE8 y abajo. – zzzzBov

16

simple:

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

window.console.log = yourCustomLog; 

Es posible que desee para anular toda la console objeto de capturar console.info, console.warn y tales:

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

No puede usar window.console = {...} porque window.console es una propiedad de solo lectura! – Luillyfe