2012-02-09 8 views
23

Ho uno script che non posso modificare che fa molte chiamate a console.log. Voglio aggiungere un altro livello e rispondere se le chiamate contengono determinate stringhe. Questo funziona in FF, ma genera un errore "Illegal invocazione" in Chrome sulla linea 4:Intercetta le chiamate su console.log in Chrome

var oldConsole = {}; 
oldConsole.log = console.log; 
console.log = function (arg) { 
    oldConsole.log('MY CONSOLE!!'); 
    oldConsole.log(arg); 
} 

Delle idee come aggirare questo? Ho provato anche la clonazione del console ...

risposta

29

È necessario chiamare console.log nel contesto console per Chrome:

(function() { 
    var log = console.log; 
    console.log = function() { 
    log.call(this, 'My Console!!!'); 
    log.apply(this, Array.prototype.slice.call(arguments)); 
    }; 
}()); 
+0

bello ... stato alla ricerca di qualcosa di simile. Può essere usato per decorare qualsiasi funzione in javascript? – Shane

+2

@Shane, questo è lo schema di base per intercettare una chiamata di funzione, tuttavia mi raccomando di non usarlo se non assolutamente necessario. È molto meglio modificare semplicemente la funzione direttamente o utilizzare i concetti OOP. – zzzzBov

+0

creazione di un framework in cui è necessario un elevato numero di componenti di runtime, sarebbe un utile strumento per un approccio esternamente al debug dei componenti o alla modifica di componenti esistenti con plug-in, ecc. C'è un impatto sulle prestazioni per questo approccio? Solo curioso di sapere quali sarebbero gli svantaggi. Non modificherò le funzioni intrinseche, solo i metodi dei componenti del framework. – Shane

4

È anche possibile utilizzare la stessa logica, ma chiamare fuori l'oggetto della console in modo che il il contesto è lo stesso.

if(window.console){ 
    console.yo = console.log; 
    console.log = function(str){ 
    console.yo('MY CONSOLE!!'); 
    console.yo(str); 
    } 
} 
0

Con ES6 nuovo operatore diffusione è possibile scrivere in questo modo

(function() { 
    var log = console.log; 
    console.log = function() { 
    log.call(this, 'My Console!!!', ...arguments); 
    }; 
}()); 
0

Lo so che è un vecchio post, ma può essere utile in ogni caso come gli altri soluzione non sono compatibili con i vecchi browser.

È possibile ridefinire il comportamento di ogni funzione della console (e per tutti i browser ) come questo:

// define a new console 
var console = (function(oldCons){ 
    return { 
     log: function(text){ 
      oldCons.log(text); 
      // Your code 
     }, 
     info: function (text) { 
      oldCons.info(text); 
      // Your code 
     }, 
     warn: function (text) { 
      oldCons.warn(text); 
      // Your code 
     }, 
     error: function (text) { 
      oldCons.error(text); 
      // Your code 
     } 
    }; 
}(window.console)); 

//Then redefine the old console 
window.console = console; 
Problemi correlati