web-dev-qa-db-ja.com

IEのconsole.logステートメントのテスト

可能性のある複製:
「コンソール」はInternet Explorerの未定義エラーです

あなたが持っている場合 console.logステートメント内のステートメント、Internet ExplorerはJavaScriptエラーをスローします(少なくともIE7では、イントラネットユーザーがインストールしたものです)。

開発テストの大部分でFirefoxを使用していますが、これは主にFirebug(多くのコンソールステートメントを使用する)が提供する機能のためですが、IEでもテストする必要があります。

javaScriptに次を追加すると、エラーはスローされません。

var debugging = false;
if (typeof console == "undefined") 
    var console = { log: function() {} };  

問題は、デバッグモードがfalseの場合にイベントをトリガーすることです。デバッグがfalseであるかどうかをテストする関数を作成し、アクション(この時点ではアラート)を実行しますが、以下を実行しようとすると、IEエラーと言ってコンソールが定義されていません

var debugging = false; // or true   
if (typeof console == "undefined") 
    var console = { log: function() {consoleMsg()} };   

function consoleMsg() {
    if(!debugging) {
    alert('Console.log event in Production Code');
}   

誰かが私のコードを修正するのを手伝うことができれば、私の目標を達成するのを助けるより良い方法を提供するか、自分自身を啓発するためのリソースに私を導くことができます。

46
Michael BW

これらすべてのフープを飛び越える必要はありません。使用する前に、単にコンソールが存在するかどうかを確認してください。

したがって、代わりに:

console.log('foo');

つかいます:

window.console && console.log('foo');

...そしてエラーは発生しません。


または、スクリプトの上部でそれを確認し、定義されていない場合は、空の関数を入力します。

// At the top of your script:
if ( ! window.console ) console = { log: function(){} };
// If you use other console methods, add them to the object literal above

// Then, anywhere in your script:
console.log('This message will be logged, but will not cause an error in IE7');

より堅牢なソリューションを得るには、次のコードを使用します(Twitterのソースコードから取得)。

// 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;
        }
    }
}());
137
Joseph Silber

「コンソール」自体は、「ログ」と同様に関数である必要があります。そう:

if(typeof(console) === 'undefined') {
    console = function(){};
    console.log = function(){consoleMsg()};
}   
5
graphicdivine

試しましたか try-catch

var debugging = false; // or true 
try {  
    console.log();
} catch(ex) {
    /*var*/ console = { log: function() {consoleMsg()} };   
}
2
Bhesh Gurung
(function(debug) {
    var console;

    function wrapConsoleMethod(fnName) {
        if(fnName in console)
            console[ fnName ] = function(fn) {
                return function() {
                    if(debug)
                        return fn.apply(console, arguments);
                    else
                        alert('Console event in Production Code');
                };
            }(console[ fnName ]);
        else
            ; // fn not in console
    };

    if(!('console' in window))
        window.console = {
            log : function() {}
            // ...
        };
    console = window.console;
    wrapConsoleMethod('log');
    // ...
})(true /* debug */);

console.log('test');
1
Saxoier