2012-02-09 8 views
23

console.logの呼び出しを多くするスクリプトを変更できません。別のレイヤーを追加して、呼び出しに特定の文字列が含まれている場合は応答します。これはFFで動作しますが、4番目のライン上のChromeで「不正な呼び出し」エラーがスローされます:Chromeのconsole.logへの呼び出しを傍受します

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

任意のアイデアは、その周りを取得する方法?

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

答えて

29

をコンソールをクローニングしてみました文脈は同じです。

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

素敵で...このような何かを探して:

あなたは、このようなコンソールの各機能(およびためすべてのブラウザ)の振る舞いを再定義することができます。これはjavascriptの任意の関数を装飾するために使用できますか? – Shane

+2

@Shane、これは関数呼び出しをインターセプトするための基本的なパターンですが、絶対に必要でない限り、これを使用することをお勧めします。関数を直接変更するだけでなく、OOPの概念を使用する方がはるかに優れています。 – zzzzBov

+0

コンポーネントのランタイムアセンブリがたくさんあるフレームワークを構築すると、コンポーネントをデバッグしたり、既存のコンポーネントをプラグインなどで変更したりする外部駆動型の方法として便利なツールになります。欠点が何であるかだけに興味があります。組み込み関数を変更するのではなく、フレームワークコンポーネントのメソッドのみを変更します。 – Shane

4

ます。また、同じロジックを使用しますが、ので、コンソールオブジェクトをオフにそれを呼び出すことができます。私はまた、あなたがChromeのconsoleのコンテキストでconsole.logを呼び出す必要があります...

0

ES6新しいスプレッド演算子を使用すると、この

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

のようにそれを書くことができ、私はそれが古いポストを知っているが、他のソリューションは、古いブラウザとの互換性はありませんように、とにかく便利です。

// 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; 
関連する問題