Internet Explorer 9でwindow.console.log
はどのような状況で定義されていますか?
window.console.log
が定義されている場合でも、window.console.log.apply
とwindow.console.log.call
は未定義です。どうしてこれなの?
[IE8の関連質問: IE8のconsole.logはどうなりましたか? 。]
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"
このconsole.logの問題の簡単な解決策は、JSコードの先頭で次を定義することです。
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };
これはすべてのブラウザで機能します。これにより、デバッガーがアクティブでないときにconsole.logのダミー関数が作成されます。デバッガーがアクティブになると、console.logメソッドが定義され、正常に実行されます。
これは非常に古い質問ですが、コンソールの問題に対処するための貴重な代替手段になると感じています。 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
console.logは、コンソールが開いているときにのみ定義されます。コードで確認したい場合は、ウィンドウプロパティ内で確認してください。
if (window.console)
console.log(msg)
これはIE9で例外をスローし、正しく機能しません。こんなことしないで
if (console)
console.log(msg)
上記の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);
}
}
}
Windowsのすべてのバージョンで閉じられた開発者ツールでconsole.logを使用した場合、IE9ではエラーが発生しません。 XPでは実行されますが、Windows 7では実行されません。したがって、一般的にWinXPのサポートを終了した場合、console.logを直接使用しても問題ありません。