window.console.log
Internet Explorer 9でどのような状況が定義されていますか?
場合でもwindow.console.log
定義され、window.console.log.apply
そしてwindow.console.log.call
不定です。どうしてこれなの?
[IE8の関連質問:IE8のconsole.logはどうなりましたか?。]
window.console.log
Internet Explorer 9でどのような状況が定義されていますか?
場合でもwindow.console.log
定義され、window.console.log.apply
そしてwindow.console.log.call
不定です。どうしてこれなの?
[IE8の関連質問:IE8のconsole.logはどうなりましたか?。]
回答:
Internet Explorer 9(および8)では、console
特定のタブの開発者ツールが開かれたときにのみオブジェクトが公開されます。そのタブの開発者ツールウィンドウを非表示にすると、console
ナビゲートするページごとにオブジェクトが表示されたままになります。新しいタブを開く場合は、console
オブジェクトを公開するために、そのタブの開発者ツールも開く必要があります。
console
オブジェクトは、任意の標準の一部ではなく、ドキュメントオブジェクトモデルの拡張です。他のDOMオブジェクトと同様に、ホストオブジェクトと見なされ、ネイティブのECMAScript関数やオブジェクトのようにObject
、から継承する必要も、からのメソッドを継承する必要もFunction
ありません。これが理由でapply
ありcall
、これらのメソッドでは定義されていません。IE 9では、ほとんどのDOMオブジェクトがネイティブECMAScriptタイプから継承するように改善されました。開発者ツールはIEの拡張機能と見なされているため(組み込みの拡張機能です)、他のDOMと同じ改善は受けていません。
それだけの価値がある場合でも、少し魔法のあるメソッドでいくつかのFunction.prototype
メソッドを使用できます。console
bind()
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
console
オブジェクトについても同じことが言えます。
この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
上記の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);
}
}
}
Function.prototype.apply.call(console.log, console, arguments);
どう...
console = { log : function(text) { alert(text); } }