Czy IE9 obsługuje console.log i czy jest to prawdziwa funkcja?

209

W jakich okolicznościach jest window.console.logzdefiniowany w Internet Explorerze 9?

Nawet jeśli window.console.logjest zdefiniowany window.console.log.applyi nie window.console.log.calljest zdefiniowany. Dlaczego to?

[Podobne pytanie do IE8: Co się stało z console.log w IE8? .]

mloughran
źródło
3
Sprawdź ten świetny post na temat zawiłości obiektu / funkcji konsoli IE8-9
Marc Climent
@MarcCliment link nie żyje
chakeda
@chakeda Nienawidzę, kiedy to się dzieje, jest link z archiwum internetowego: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Odpowiedzi:

299

W Internet Explorerze 9 (i 8) consoleobiekt jest widoczny tylko wtedy, gdy narzędzia programistyczne są otwarte dla określonej karty. Jeśli ukryjesz okno narzędzi programisty dla tej karty, consoleobiekt pozostanie widoczny dla każdej strony, do której nawigujesz. Jeśli otworzysz nową kartę, musisz także otworzyć narzędzia programistyczne dla tej karty, aby consoleobiekt został ujawniony.

consoleObiekt nie jest częścią żadnego standardu i jest rozszerzeniem Document Object Model. Podobnie jak inne obiekty DOM, jest uważany za obiekt hosta i nie wymaga się dziedziczenia Objectani metod od Function, podobnie jak rodzime funkcje ECMAScript i obiekty. To jest powód applyi callsą niezdefiniowane dla tych metod. W IE 9 większość obiektów DOM została ulepszona w celu dziedziczenia z rodzimych typów ECMAScript. Ponieważ narzędzia programistyczne są uważane za rozszerzenie IE (aczkolwiek wbudowane rozszerzenie), najwyraźniej nie otrzymały takich samych ulepszeń jak reszta DOM.

Za to, co jest warte, możesz nadal używać niektórych Function.prototypemetod w consolemetodach z odrobiną bind()magii:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Andy E.
źródło
2
To samo dotyczy consoleobiektu Firebug .
Marcel Korpel
150
Mogę z dumą powiedzieć, że przez wiele lat, które tworzyłem dla Internetu, założyłem, że console.log jest obsługiwany przez wszystkie główne przeglądarki. Właśnie spędziłem dzień, zastanawiając się, dlaczego IE9 nie lubi mojego skryptu, a teraz wiem, dlaczego - w pierwszej kolejności miał plik console.log. Niemożliwe jest debugowanie, ponieważ zmiana trybu debugowania sprawiła, że ​​ten błąd zniknął w mgnieniu oka: P Dziękujemy za wyjaśnienie !!
f055
2
Miałem ten sam problem wczoraj. Instalowanie DebugBar stało się szybsze, ponieważ nie definiuje obiektu konsoli. Więc kiedy ukryłem konsolę IE, ale nie DebugBar, dostałem wiadomość od tego ostatniego, że wystąpił błąd JavaScript (konsola nie jest zdefiniowana).
Simon A. Eugster,
powinieneś sprawdzić dziennik błędów przy pierwszym pojawieniu się problemu na IE @ f055
Lucky Ali,
7
Opcje internetowe -> Zaawansowane -> Wyświetl powiadomienie o każdym błędzie skryptu. Twórcy stron internetowych powinni zawsze pozostawić to zaznaczone w IE. To by Cię poinformowało o konsoli lub niezdefiniowanej funkcji dziennika ... nie pamiętam dokładnie wiadomości.
Seth Flowers
166

Prostym rozwiązaniem tego problemu w pliku console.log jest zdefiniowanie następujących elementów na początku kodu JS:

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

Działa to dla mnie we wszystkich przeglądarkach. Spowoduje to utworzenie fałszywej funkcji dla pliku console.log, gdy debugger nie jest aktywny. Gdy debugger jest aktywny, metoda console.log jest zdefiniowana i wykonuje się normalnie.

Michael Erickson
źródło
8
Więcej informacji i bardziej niezawodne wymiany konsoli (w tym inne metody konsoli) tutaj: stackoverflow.com/questions/8002116/…
Zach Lysobey,
@ZachL: Które konkretnie konkretnie?
hakre
Moja odpowiedź ma jedno podejście: stackoverflow.com/a/15771110/363701 . Sprawdź to również: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey
13

Wiem, że to bardzo stare pytanie, ale uważam, że stanowi to cenną alternatywę dla rozwiązania problemu z konsolą. Umieść poniższy kod przed każdym wywołaniem konsoli. * (Więc twój pierwszy skrypt).

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

Odniesienie:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js

Steven Anderson
źródło
10

Plik console.log jest definiowany tylko wtedy, gdy konsola jest otwarta. Jeśli chcesz to sprawdzić w kodzie, upewnij się, że jest to zaznaczone we właściwości okna

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

powoduje to wyjątek w IE9 i nie będzie działał poprawnie. Nie rób tego

if (console) 
    console.log(msg)
Jan
źródło
6

Po przeczytaniu artykułu z powyższego komentarza Marc Cliament zmieniłem teraz moją uniwersalną funkcję console.log w przeglądarce dla różnych przeglądarek:

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);
        }
    }
}
James Ford
źródło
1
TylkoFunction.prototype.apply.call(console.log, console, arguments);
Victor,
@Victor zdecydowanie powinna być jedyną akceptowaną odpowiedzią!
Pavel Frankov
0

Chciałbym wspomnieć, że IE9 nie podnosi błędu, jeśli używasz console.log z narzędziami programistycznymi zamkniętymi we wszystkich wersjach systemu Windows. W XP tak, ale w Windows 7 nie. Jeśli więc zrezygnowałeś z obsługi WinXP w ogóle, możesz używać konsoli console.log bezpośrednio.

Paolo Mioni
źródło
-1

Co powiesz na...

console = { log : function(text) { alert(text); } }
Ceilingfish
źródło
1
W niektórych przypadkach może to być znośne obejście, ale tak naprawdę nie rozwiązałeś tego pytania.
pswg,