web-dev-qa-db-ja.com

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

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

window.console.logが定義されている場合でも、window.console.log.applywindow.console.log.callは未定義です。どうしてこれなの?

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

205
mloughran

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

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

それが価値があるのは、少しの bind() マジックでconsoleメソッドでFunction.prototypeメソッドを使用することです:

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

このconsole.logの問題の簡単な解決策は、JSコードの先頭で次を定義することです。

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

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

165

これは非常に古い質問ですが、コンソールの問題に対処するための貴重な代替手段になると感じています。 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

13
Steven Anderson

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

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

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

if (console) 
    console.log(msg)
10
John

上記の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);
        }
    }
}
6
James Ford

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

0
Paolo Mioni