2012-07-09 69 views

回答

113

您可以通過以下方式劫持的JavaScript函數:

(function(){ 
    var oldLog = console.log; 
    console.log = function (message) { 
     // DO MESSAGE HERE. 
     oldLog.apply(console, arguments); 
    }; 
})(); 
  1. 第1行將函數封裝在閉包中,因此沒有其他函數可直接訪問oldLog(出於可維護性原因)。
  2. 第2行捕獲原始方法。
  3. 第3行創建一個新功能。
  4. 第4行是您向您的服務器發送message的地方。
  5. 第5行調用最初處理的原始方法。

apply使用,所以我們可以使用原來的參數調用它console。只需撥打oldLog(message)就會失敗,因爲log取決於其與console的關聯。


更新每zzzzBov的評論下面,在IE9 console.log實際上不是一個功能,所以oldLog.apply會失敗。有關更多詳細信息,請參閱console.log.apply not working in IE9

+1

[您的代碼在IE中會有問題,因爲'console.log'實際上並不是IE中的'Function'實例](http://stackoverflow.com/questions/5538972/console-log-apply-not-working-在-IE9)。 – zzzzBov 2014-01-08 14:31:34

+0

@zzzzBov有趣的。我假設分配'console._oldLog = console.log; console._oldLog(message);'會起作用,但是如果'console'本身就是一個託管對象,那麼不會有任何更改被保留。不幸的是,我沒有IE來測試這個了。 – 2014-01-08 16:19:44

+0

是的,你仍然可以像這樣調用'_oldLog'。 'oldLog = Function.prototype.bind.call(console.log,console)'適用於IE9 +,但是對於IE8及更低版本,需要爲'Function.prototype.bind'添加一個polyfill。 – zzzzBov 2014-01-08 16:30:24

16

簡單:

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

window.console.log = yourCustomLog; 

您可能要覆蓋整個console對象捕捉console.infoconsole.warn和這樣的:

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

您無法使用window.console = {...},因爲window.console是一個只讀屬性! – Luillyfe 2018-02-23 21:28:29