14

次のJavascriptコード(私の制御不能)がページの早い段階で実行されているシステムを扱っています

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

consoleこのコードは、javascriptコンソールのない環境でjavascriptエラーを防ぐためのモックオブジェクトを作成するために使用されているようです。これは、GoogleChromeのコンソールの実行を妨げることを除けば素晴らしいことです。条件付きで明示的にチェックしますがfirebug、それだけです

    if (!("console" in window) || !("firebug" in console))

では、Chromeのデバッガーにコンソールオブジェクトを再初期化するように指示する方法はありますか?つまり、平易な英語でChromeに伝えます

ねえ、あなたがページをロードして、私が使用するコンソールオブジェクトを定義するとき、あなたは知っていますか?これをもう一度実行して、ユーザースペースの誰かが行ったことをオーバーライドできるようにします。

私は私が次のようなことをすることができることに気づきます

console.firebug = "faketrue";

条件付きでキャッチされていますが、システムに制限があり、上記のコンソールの再定義がヒットする前にJavaScriptを追加する方法がありません。言い換えれば、いいえ、ヘッドの開始直後にJavaScriptコードを少し追加することはできません。

4

7 に答える 7

17

iframe inject を使用してこれを実行し、iframe のコンソール オブジェクトをコピーできると思います。

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
</script>
<iframe id="text"></iframe>
<script type="text/javascript">
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>

http://jsfiddle.net/nmY6k/

これは、概念が機能することを示す単なるデモンストレーションであることに注意してください。

編集

純粋な JS iframe の場合:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>

http://jsfiddle.net/nmY6k/1/

編集

もちろん、後で iframe 要素を削除する必要がある場合は、次のようにします。

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
console.log(typeof window.frames);
document.body.removeChild(iframe);
console.log(typeof window.frames);
</script>
于 2011-05-25T22:47:08.620 に答える
3

Google Chrome では、consoleオブジェクトの削除は次のように機能します。

<script>
window.console = {};
delete console;
console.log('still works');
</script>

ただし、これは Firefox 4 では機能しないようです。

于 2011-05-25T23:37:22.617 に答える
2

これはうまくいくようです:

iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = iframe.contentWindow.console;

ただし、iframeを削除できないようです

于 2011-05-25T22:51:43.533 に答える
1

上記のように、コンソールを割り当てるための非常に基本的なユーザースクリプトを作成できます。次に、そのユーザー スクリプトの manifest.json に移動し、run_at 設定 ( http://code.google.com/chrome/extensions/content_scripts.htmlを参照) を document_start に変更します。これにより、ページスクリプトが実行されるにユーザースクリプトが実行されるようになり、コンソールが台無しになる前に実行されます。

...編集...

実際、http://blog.chromium.org/2011/07/chrome-extensions-now-with-more.htmlから、chrome も @run-at をサポートするようになったことに注意してください。 manifest.json を直接いじる必要さえあります。http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/userscript-runat/runat.userの document_start で @run-at を使用したサンプル スクリプトがあります。.js?view=マークアップ

于 2012-01-22T11:07:57.653 に答える
0

独自のスクリプトを html の先頭に直接配置することはできませんか?

<script ...>
    if (console) { window.cache_console = console; }
</script>
</head>
<body>
... html ...

<script>
    window.console = window.cache_console;
</script>
</body>
</html>

HEAD の真上よりも早く取得することはできません。

于 2011-05-25T22:31:59.610 に答える
0

あなたが懸念している理由が、開発中にコンソールを通常どおり使用したいということであると仮定すると、条件が false と評価されるように、console.firebug を定義する単純な chrome 拡張機能を作成できます。そうすれば、他のフレームのコンソール オブジェクトを使用することで発生する可能性のある風変わりな動作について心配する必要はありません。また、開発/デプロイ時にハックを繰り返し挿入および削除することについて心配する必要もありません。

于 2011-05-25T23:04:20.060 に答える