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? .]


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"

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.


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


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


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)

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

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.


-1

Co powiesz na...

console = { log : function(text) { alert(text); } }

1
W niektórych przypadkach może to być znośne obejście, ale tak naprawdę nie rozwiązałeś tego pytania.
pswg,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.