2012-09-26 3 views
11

ゴーTwitterのログインページに、コンソールに次のように入力します。Chromeの一部のサイトでconsole.logが空の機能となるのはなぜですか?

window.addEventListener('keypress', function(e){console.log('hello')}, true)

は(注:どのように三番目のパラメータは、イベントのキャプチャを可能にするtrueに設定されている。これは、ウィンドウで最初にインターセプトされるイベントが発生します。子要素で消費される前に)

いくつかのキーを押してみてください。 helloがコンソールにどのように出力されていないかに注目してください。​​またはkeyupのイベントリスナーを追加しても何も変更されません。

helloは、ほとんどのウェブサイトでは出力されますが、TwitterやGmailなどのサイトでは出力されません。

なぜですか?何がイベントリスナーを停止していますか?

編集:Firefoxで期待どおりに動作するようです。しかし、Chromeはありません。 Chromeがイベントリスナーを期待どおりに起動しないのはなぜですか?

編集2:下記のように推測されるように、console.logは、TwitterやGmailなどのサイトではChromeの空の機能です。何故ですか?

+0

あなたは 'document'の代わりに、'ウィンドウに追加すべきではありません'? – Bergi

+0

おそらく、いくつかのキーで 'keydown'を使ってイベントを取り消しています。 – Shmiddty

+0

なぜですか? (それでも問題は解決しません) – Matm

答えて

15

これらのサイトは、具体的には(明らかにwebkitのために)設定されているので:

console.log = function(){}; 

しかし、Chromeでコンソールで次のコマンドを発行して、元のlog()の機能を復元することができます。そして、

console.log = console.__proto__.log 

あなたをこれを行うことができます:

window.addEventListener('keypress', function(e){console.log('hello')}, true) 

期待どおりに動作するはずです。

+0

それは問題ではないようです。わかりやすく元の投稿を編集しました - イベントキャプチャをオンにしても、リスナーはまだ呼び出されていません。 – Matm

+0

は既に別の投稿でこれを尋ねましたが、console.logはChromeでは空の機能ですがFirefoxではどうしてですか? – Matm

+0

彼らは特にWebkitの機能を上書きしています。今すぐスクリプトを見て... – canon

0

console.logに問題があります。代わりにこれを試してください:

window.addEventListener('keypress', function(e){alert('hello')}, true) 
+1

このシナリオではconsole.logは永遠に閉じ込められていますか?元の機能を取得する方法はありますか? – Matm

+0

まだ私を混乱させる。なぜ、console.logはFirefoxではなく、Chromeでは空の機能ですか? – Matm

+0

彼らは具体的にはWebkitの機能を上書きしますが、私は想像していました。 – canon

0

この問題はFirefoxでは発生しません。

Chromeでチェックしたところ、何らかの理由でGmailとTwitterのページがconsole.logを空の関数function() {}に再割り当てしてしまうので、ハンドラが呼び出されても何もしません。 console.logの代わりにalert()を試してみると、正常に動作しています。

興味深い。

+0

ああ、うわー。本当に面白いです。 – Matm

+0

@ jfriend00、それは正しい答えのように私に聞こえる。 – Matm

+0

@Matm - OK、私はそのコメントを答えに入れ、コメントを削除しました。 – jfriend00

2

開発者は、トラブルシューティングやデバッグのためにコードにconsole.log()ステートメントを入れることが好きです。時々、彼らは生産コードをチェックインするときにそれらをすべて忘れることを忘れます。これに対する単純な防護策は、生産コードのconsole.log()を何もしない空の関数に再定義することです。たとえ開発者が間違って1を残したとしても、実行されていないときにはconsoleオブジェクトがないときには出力が発生せず例外がスローされますデバッガ(IEのような)。

一部のブラウザでは、このような方法で上書きできないように読み取り専用にすることでその機能を置き換えることができますが、そうした場合、コンソールオブジェクトが存在していない必要があります場合によってはconsole.log()声明。これらの残されたconsole.log()ステートメントの主な害は、デバッガが実行されていない限り、consoleオブジェクトが存在しないため例外がスローされるIEにあります。

+0

私は手動でconsole.logをFirefox上で手動で上書きすることはできません。ブラウザ特有のものではありません。WebkitをターゲットとしたTwitterでなければなりません(前述のように) – Matm

+0

プロダクションコードに空の関数を追加できますが、ログステートメントを削除することはできません。それらは愚かな開発者です。それが本当に理由だと思いますか? – Rudie

0

のiframeからそれを取得します。

function setConsole() { 
    var iframe = document.createElement('iframe'); 
    iframe.style.display = 'none'; 
    document.body.appendChild(iframe); 
    console = iframe.contentWindow.console; 
    window.console = console; 
} 

(と、それを呼び出す)

setConsole() 

ソース:https://gist.github.com/cowlicks/a3bc662b38c36483b35f74b2b54e37c0

関連する問題