IE9はconsole.logをサポートしていますか?それは実際の機能ですか?


209

window.console.logInternet Explorer 9でどのような状況が定義されていますか?

場合でもwindow.console.log定義され、window.console.log.applyそしてwindow.console.log.call不定です。どうしてこれなの?

[IE8の関連質問:IE8のconsole.logはどうなりましたか?。]


3
IE8-9コンソールオブジェクト/機能の複雑さについては、この偉大なポストをチェックアウト:whattheheadsaid.com/2011/04/...
マルク・Climent


@MarcClimentリンクは機能していません
chakeda 2018

この問題が発生したとき@chakeda私は、Webアーカイブからリンクがあります、嫌い:web.archive.org/web/20140625085155/http://whattheheadsaid.com/...
マルク・Climent

回答:


299

Internet Explorer 9(および8)では、console特定のタブの開発者ツールが開かれたときにのみオブジェクトが公開されます。そのタブの開発者ツールウィンドウを非表示にすると、consoleナビゲートするページごとにオブジェクトが表示されたままになります。新しいタブを開く場合は、consoleオブジェクトを公開するために、そのタブの開発者ツールも開く必要があります。

consoleオブジェクトは、任意の標準の一部ではなく、ドキュメントオブジェクトモデルの拡張です。他のDOMオブジェクトと同様に、ホストオブジェクトと見なされ、ネイティブのECMAScript関数やオブジェクトのようにObject、から継承する必要も、からのメソッドを継承する必要もFunctionありません。これが理由でapplyありcall、これらのメソッドでは定義されていません。IE 9では、ほとんどのDOMオブジェクトがネイティブECMAScriptタイプから継承するように改善されました。開発者ツールはIEの拡張機能と見なされているため(組み込みの拡張機能です)、他のDOMと同じ改善は受けていません。

それだけの価値がある場合でも、少し魔法のあるメソッドでいくつかのFunction.prototypeメソッドを使用できます。consolebind()

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"

2
Firebugのconsoleオブジェクトについても同じことが言えます。
Marcel Korpel

150
私がWeb用に開発した何年もの間、console.logはすべての主要なブラウザーでサポートされていると想定していました。なぜIE9が私のスクリプトを気に入らないのかを検討するのに1日費やしましたが、今ではその理由がわかります。最初のステップにconsole.logがありました。デバッグモードをオンにすると、このバグはすぐに解消されたため、デバッグできません。
f055

2
昨日も同じ問題がありました。DebugBarのインストールは、コンソールオブジェクトを定義していないため、たまたま私を助けてくれました。そのため、IEコンソールを非表示にしてDebugBarを非表示にすると、JavaScriptエラーが発生したというメッセージがコンソールから表示されました(コンソールが定義されていません)。
Simon A. Eugster 2012

問題がIE @ f055で最初に発生したときにエラーログをチェックする必要がありました
Lucky Ali

7
インターネットオプション->詳細設定->すべてのスクリプトエラーに関する通知を表示します。Web開発者は、常にIEでこれをチェックしたままにしておく必要があります。これは、コンソールまたはログ関数が未定義であることを通知します...メッセージを正確に思い出せません。
セスフラワーズ

166

このconsole.logの問題の簡単な解決策は、JSコードの最初に次のように定義することです。

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

これはすべてのブラウザで機能します。これにより、デバッガーがアクティブでないときにconsole.logのダミー関数が作成されます。デバッガーがアクティブな場合、メソッドconsole.logが定義され、通常どおり実行されます。


8
ここでは詳細情報、および(他のコンソール方法を含む)、より堅牢なコンソールの交換:stackoverflow.com/questions/8002116/...
ザックLysobey

@ZachL:具体的に具体的にはどれですか?
2015

私の答えには1つのアプローチがあります:stackoverflow.com/a/15771110/363701。こちらもご覧
Zach Lysobey

13

私はこれが非常に古い質問であることを知っていますが、これがコンソールの問題に対処する方法の貴重な代替案を追加すると感じます。console。*を呼び出す前に次のコードを配置します(つまり、最初のスクリプトです)。

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

リファレンス:https :
//github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js


10

console.logは、コンソールが開いているときにのみ定義されます。コードで確認したい場合は、ウィンドウプロパティ内で確認してください

if (window.console)
    console.log(msg)

これはIE9で例外をスローし、正しく機能しません。こんなことしないで

if (console) 
    console.log(msg)

6

上記のMarc Cliamentのコメントからの記事を読んだ後、私は今、多目的のクロスブラウザーconsole.log関数を次のように変更しました:

function log()
{
    "use strict";

    if (typeof(console) !== "undefined" && console.log !== undefined)
    {
        try
        {
            console.log.apply(console, arguments);
        }
        catch (e)
        {
            var log = Function.prototype.bind.call(console.log, console);
            log.apply(console, arguments);
        }
    }
}

1
JustFunction.prototype.apply.call(console.log, console, arguments);
Victor

@ビクターそれは間違いなく唯一の受け入れられた答えであるべきです!
Pavel Frankov 2015年

0

Windowsのすべてのバージョンで開発者ツールを閉じてconsole.logを使用しても、IE9はエラーを発生させないことを述べたいと思います。XPではできますが、Windows 7ではできません。したがって、一般的にWinXPのサポートを終了した場合は、console.logを直接使用して問題ありません。


-1

どう...

console = { log : function(text) { alert(text); } }

1
これは、場合によっては回避可能な回避策となる場合がありますが、実際には問題に対処していません。
pswg 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.