2011-09-28 16 views
45

Possible Duplicate:
'console' is undefined error for internet explorerTestowanie console.log sprawozdania w IE

Jeśli masz console.log oświadczenia w kodzie, Internet Explorer wygeneruje błąd JavaScript (przynajmniej w IE7, która jest co nasi użytkownicy intranet został zainstalowany).

Używam Firefoxa do większości moich testów programistycznych głównie ze względu na funkcjonalność dostarczaną przez Firebug (gdzie używam wielu instrukcji konsoli), ale muszę też przetestować w IE.

jeśli dodać do mojego JavaScript, co następuje, błąd nie zostanie zgłoszony.

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

Problem polega na tym, że chciałbym wywołać zdarzenie, jeśli tryb debugowania jest fałszywy. Jeśli utworzę funkcję, aby sprawdzić, czy debugowanie jest fałszywe i wykonać działanie (w tym momencie tylko alert), ale gdy próbuję wykonać następujące czynności, pojawia się błąd IE, mówiąc, że Konsola nie jest zdefiniowana.

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'); 
} 

Jeśli ktoś może mi pomóc rozwiązać mój kod, zapewniają lepszy sposób, aby pomóc mi osiągnąć mój cel, lub skierować mnie do zasobu edumacate ja byłbym bardzo wdzięczny.

+5

http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer sprawdzić –

Odpowiedz

137

Nie musisz przeskakiwać przez wszystkie te obręcze. Po prostu sprawdź, czy konsola istnieje przed użyciem.

Więc zamiast:

console.log('foo'); 

użytkowania:

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

... i nie będzie żadnych błędów.


Alternatywnie, można po prostu sprawdzić to na górze skryptu, a jeśli jest niezdefiniowany, wystarczy wypełnić go z pustym funkcję:

// 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'); 

Dla bardziej niezawodne rozwiązanie , użyj tego fragmentu kodu (pobranego z kodu źródłowego twittera):

// 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; 
     } 
    } 
}()); 
+3

To nadal daje "ReferenceError", jeśli 'console' nie jest zdefiniowany. – pimvdb

+4

@pimvdb - zapomniałem dodać część 'window.'. Dzięki. Zaktualizowano. –

+1

Naprawiono drobny błąd: Musi to być 'window.console || (console = {log: function() {}}); 'zamiast' window.console || console = {log: function() {}}; ' – some

5

sama "konsola" musi pełnić funkcję oraz "log". Więc:

if(typeof(console) === 'undefined') { 
    console = function(){}; 
    console.log = function(){consoleMsg()}; 
} 
+1

Dlaczego powinna to być funkcja? Próbowałem: 'console()' i otrzymałem komunikat o błędzie: 'object 'console' nie jest funkcją" –

+2

Jest to obiekt w Firefoksie z firebug, Chrome, Safari i Operą. – some

+0

Doceń próbę dodania dodatkowych informacji do tej odpowiedzi, ale bardziej odpowiednie byłoby utworzenie nowej odpowiedzi z sugerowanymi rozszerzonymi możliwościami. – JDB

2

Próbowałaś try-catch:

var debugging = false; // or true 
try { 
    console.log(); 
} catch(ex) { 
    /*var*/ console = { log: function() {consoleMsg()} }; 
} 
+0

+1 Umieszczam to na początku mojego js i teraz mogę użyć 'console.log (myVariable)' wszędzie, dzięki! –

1
(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');