Jak wydrukować komunikaty debugowania w konsoli JavaScript Google Chrome?


466

Jak wydrukować komunikaty debugowania w konsoli JavaScript Google Chrome?

Pamiętaj, że konsola JavaScript nie jest tym samym co debuger JavaScript; mają różne składnie AFAIK, więc polecenie drukowania w JavaScript Debugger nie będzie tutaj działać. W konsoli JavaScript print()wyśle ​​parametr do drukarki.

Odpowiedzi:


597

Wykonanie następującego kodu z paska adresu przeglądarki:

javascript: console.log (2);

pomyślnie drukuje wiadomość do „konsoli JavaScript” w Google Chrome.


13
Właśnie uświadomiłem sobie, że console.log()jest świetny do debugowania js ... Często zapominam o użyciu go w praktyce.
Ish

Jak długo może trwać jedno z tych „wyjść”? Przy okazji,
głosowanie

3
@dbrin jest to w porządku dla rozwoju, jednak każdy console.log()kod powinien zostać usunięty z kodu produkcyjnego przed wdrożeniem.
Samuel MacLachlan

2
@Sebas Console.Lognależy usunąć z kodu produkcyjnego przed wdrożeniem, ponieważ jeśli nie, wiadomości te będą logować się do konsoli JavaScript użytkowników. Chociaż raczej go nie zobaczą, zajmuje ono pamięć w urządzeniu. Ponadto, w zależności od zawartości dziennika, potencjalnie mówisz innym, jak zhakować / odtworzyć aplikację.
Samuel MacLachlan

166

Udoskonalając pomysł Andru, możesz napisać skrypt, który tworzy funkcje konsoli, jeśli nie istnieją:

if (!window.console) console = {};
console.log = console.log || function(){};
console.warn = console.warn || function(){};
console.error = console.error || function(){};
console.info = console.info || function(){};

Następnie skorzystaj z jednego z poniższych:

console.log(...);
console.error(...);
console.info(...);
console.warn(...);

Funkcje te rejestrują różne typy elementów (które można filtrować na podstawie dziennika, informacji, błędu lub ostrzeżenia) i nie powodują błędów, gdy konsola nie jest dostępna. Te funkcje będą działać w konsolach Firebug i Chrome.


Dziękuję za to. Czy kod nie byłby ściślejszy, gdybyś raz użył polecenia „jeśli”, if (!window.console) {a następnie umieścił wszystko w nawiasach? W tej chwili oceniasz te same rzeczy cztery razy.
Dan Rosenstark,

Nie, b / c po prostu mając window.console nie gwarantuje, że będziesz mieć window.console.log lub .warn & c
Paul

18
Bądź ostrożny, ponieważ jeśli ten skrypt zostanie załadowany ze stroną, a okno konsoli nie zostanie otwarte, utworzy „sztuczną” konsolę, która może uniemożliwić działanie prawdziwej konsoli, jeśli otworzysz konsolę po załadowaniu strony. (przynajmniej tak jest w przypadku starszych wersji firefox / firebug i chrome)
cwd 11.10.11

1
Mam do tego uzupełnienia, patrz moja odpowiedź poniżej
Tim Büthe

1
Nie, nie spowoduje to przerwania chrome z błędem TypeError. Powyższe powiązane pytanie dotyczy dzwonienia w tym celu . Powyższy kod tego nie robi i będzie działał dobrze w Chrome
gman

47

Po prostu dodaj fajną funkcję, której brakuje wielu programistom:

console.log("this is %o, event is %o, host is %s", this, e, location.host);

Jest to magiczny %ozrzut, który można kliknąć i który można głęboko przeglądać w obiekcie JavaScript. %spokazano tylko dla zapisu.

To też jest fajne:

console.log("%s", new Error().stack);

Co daje ślad stosu podobny do Java do punktu new Error()wywołania (w tym ścieżkę do pliku i numer linii !).

Zarówno %oi new Error().stacksą dostępne w Chrome i Firefox!

Również w przypadku śladów stosu w przeglądarce Firefox:

console.trace();

Jak mówi https://developer.mozilla.org/en-US/docs/Web/API/console .

Miłego hakowania!

AKTUALIZACJA : Niektóre biblioteki są pisane przez złych ludzi, którzy redefiniują consoleobiekt do własnych celów. Aby przywrócić oryginalną przeglądarkę consolepo załadowaniu biblioteki, użyj:

delete console.log;
delete console.warn;
....

Zobacz pytanie Przepełnienie stosu Przywracanie console.log () .


3
Jeszcze jedna, którą właśnie odkryłem: console.dir developer.mozilla.org/en-US/docs/Web/API/console.dir
dbrin

17

Krótkie ostrzeżenie - jeśli chcesz przetestować w Internet Explorerze bez usuwania wszystkich console.log (), musisz użyć Firebug Lite lub otrzymasz kilka niezbyt przyjaznych błędów.

(Lub utwórz własną konsolę.log (), która po prostu zwraca wartość false.)


2
Unikam błędów w różnych przeglądarkach takich jak: if (console) console.log ()
Craig Wohlfeil,

Jeśli otworzysz narzędzia programistyczne w IE (F12), consoleobiekt zostanie utworzony i istnieje do momentu zamknięcia tego wystąpienia przeglądarki.
Tim Büthe,

17

Oto krótki skrypt sprawdzający, czy konsola jest dostępna. Jeśli tak nie jest, próbuje załadować Firebug, a jeśli Firebug nie jest dostępny, ładuje Firebug Lite. Teraz możesz używać console.logw dowolnej przeglądarce. Cieszyć się!

if (!window['console']) {

    // Enable console
    if (window['loadFirebugConsole']) {
        window.loadFirebugConsole();
    }
    else {
        // No console, use Firebug Lite
        var firebugLite = function(F, i, r, e, b, u, g, L, I, T, E) {
            if (F.getElementById(b))
                return;
            E = F[i+'NS']&&F.documentElement.namespaceURI;
            E = E ? F[i + 'NS'](E, 'script') : F[i]('script');
            E[r]('id', b);
            E[r]('src', I + g + T);
            E[r](b, u);
            (F[e]('head')[0] || F[e]('body')[0]).appendChild(E);
            E = new Image;
            E[r]('src', I + L);
        };
        firebugLite(
            document, 'createElement', 'setAttribute', 'getElementsByTagName',
            'FirebugLite', '4', 'firebug-lite.js',
            'releases/lite/latest/skin/xp/sprite.png',
            'https://getfirebug.com/', '#startOpened');
    }
}
else {
    // Console is already available, no action needed.
}

14

Oprócz odpowiedzi Delana Azabani , lubię się dzielić console.jsi używam do tego samego celu. Tworzę konsolę noop, używając tablicy nazw funkcji, co jest moim zdaniem bardzo wygodnym sposobem, aby to zrobić, i zająłem się Internet Explorerem, który ma console.logfunkcję, ale nie console.debug:

// Create a noop console object if the browser doesn't provide one...
if (!window.console){
  window.console = {};
}

// Internet Explorer has a console that has a 'log' function, but no 'debug'. To make console.debug work in Internet Explorer,
// We just map the function (extend for info, etc. if needed)
else {
  if (!window.console.debug && typeof window.console.log !== 'undefined') {
    window.console.debug = window.console.log;
  }
}

// ... and create all functions we expect the console to have (taken from Firebug).
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

for (var i = 0; i < names.length; ++i){
  if(!window.console[names[i]]){
    window.console[names[i]] = function() {};
  }
}

12

Lub użyj tej funkcji:

function log(message){
    if (typeof console == "object") {
        console.log(message);
    }
}

console.constructor === Object && (log = m => console.log(m))
Josh Habdas,

7

Oto moja klasa otoki konsoli. Daje mi to również zakres działania, aby ułatwić życie. Zwróć uwagę na użycie localConsole.debug.call()takiego, który localConsole.debugdziała w zakresie klasy wywołującej, zapewniając dostęp do jej toStringmetody.

localConsole = {

    info: function(caller, msg, args) {
        if ( window.console && window.console.info ) {
            var params = [(this.className) ? this.className : this.toString() + '.' + caller + '(), ' + msg];
            if (args) {
                params = params.concat(args);
            }
            console.info.apply(console, params);
        }
    },

    debug: function(caller, msg, args) {
        if ( window.console && window.console.debug ) {
            var params = [(this.className) ? this.className : this.toString() + '.' + caller + '(), ' + msg];
            if (args) {
                params = params.concat(args);
            }
            console.debug.apply(console, params);
        }
    }
};

someClass = {

    toString: function(){
        return 'In scope of someClass';
    },

    someFunc: function() {

        myObj = {
            dr: 'zeus',
            cat: 'hat'
        };

        localConsole.debug.call(this, 'someFunc', 'myObj: ', myObj);
    }
};

someClass.someFunc();

Daje to wynik tak jak w Firebug :

In scope of someClass.someFunc(), myObj: Object { dr="zeus", more...}

Lub Chrome:

In scope of someClass.someFunc(), obj:
Object
cat: "hat"
dr: "zeus"
__proto__: Object

6

Osobiście używam tego, który jest podobny do tarka11011:

// Use a less-common namespace than just 'log'
function myLog(msg)
{
    // Attempt to send a message to the console
    try
    {
        console.log(msg);
    }
    // Fail gracefully if it does not exist
    catch(e){}
}

Chodzi przede wszystkim o to, że dobrym pomysłem jest, aby przynajmniej poćwiczyć logowanie poza console.log()kodowaniem bezpośrednio w kodzie JavaScript, ponieważ jeśli o nim zapomnisz i znajduje się on na stronie produkcyjnej, może potencjalnie złamać cały kod JavaScript dla tej strony.


dlaczego nie if(windows.console) console.log(msg)?
CJStuart,

window.consolemasz na myśli. przydałaby się próba tylko wtedy, gdy błąd został zgłoszony (jeśli plik console.log nie był funkcją), ponieważ konsola została ponownie zdefiniowana. Robienie window.console && window.console.log instanceof Functionbyłoby bardziej przydatne.
Aram Kocharyan

4

Możesz użyć, console.log()jeśli masz debugowany kod w jakim edytorze oprogramowania do programowania i zobaczysz wynik, który prawdopodobnie jest najlepszym edytorem dla mnie (Google Chrome). Po prostu naciśnij F12i naciśnij kartę Konsola. Zobaczysz wynik. Szczęśliwego kodowania. :)


4

Miałem wiele problemów z programistami sprawdzającymi instrukcje w konsoli. (). Naprawdę nie lubię debugowania programu Internet Explorer, pomimo fantastycznych ulepszeń programu Internet Explorer 10 i Visual Studio 2012 itp.

Więc przesłoniłem sam obiekt konsoli ... Dodałem flagę __localhost, która zezwala na instrukcje konsoli tylko na localhost. Dodałem również funkcje konsoli. () Do Internet Explorera (zamiast tego wyświetla się alert ()).

// Console extensions...
(function() {
    var __localhost = (document.location.host === "localhost"),
        __allow_examine = true;

    if (!console) {
        console = {};
    }

    console.__log = console.log;
    console.log = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__log === "function") {
                console.__log(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert(msg);
            }
        }
    };

    console.__info = console.info;
    console.info = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__info === "function") {
                console.__info(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert(msg);
            }
        }
    };

    console.__warn = console.warn;
    console.warn = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__warn === "function") {
                console.__warn(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert(msg);
            }
        }
    };

    console.__error = console.error;
    console.error = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__error === "function") {
                console.__error(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert(msg);
            }
        }
    };

    console.__group = console.group;
    console.group = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__group === "function") {
                console.__group(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert("group:\r\n" + msg + "{");
            }
        }
    };

    console.__groupEnd = console.groupEnd;
    console.groupEnd = function() {
        if (__localhost) {
            if (typeof console !== "undefined" && typeof console.__groupEnd === "function") {
                console.__groupEnd(arguments);
            } else {
                var i, msg = "";
                for (i = 0; i < arguments.length; ++i) {
                    msg += arguments[i] + "\r\n";
                }
                alert(msg + "\r\n}");
            }
        }
    };

    /// <summary>
    /// Clever way to leave hundreds of debug output messages in the code,
    /// but not see _everything_ when you only want to see _some_ of the
    /// debugging messages.
    /// </summary>
    /// <remarks>
    /// To enable __examine_() statements for sections/groups of code, type the
    /// following in your browser's console:
    ///       top.__examine_ABC = true;
    /// This will enable only the console.examine("ABC", ... ) statements
    /// in the code.
    /// </remarks>
    console.examine = function() {
        if (!__allow_examine) {
            return;
        }
        if (arguments.length > 0) {
            var obj = top["__examine_" + arguments[0]];
            if (obj && obj === true) {
                console.log(arguments.splice(0, 1));
            }
        }
    };
})();

Przykładowe zastosowanie:

    console.log("hello");

Chrome / Firefox:

    prints hello in the console window.

Internet Explorer:

    displays an alert with 'hello'.

Dla tych, którzy przyjrzą się kodowi, odkryjesz funkcję console.examine (). Stworzyłem to lata temu, aby pozostawić kod debugowania w niektórych obszarach wokół produktu, aby pomóc w rozwiązywaniu problemów związanych z kontrolą jakości / klientem. Na przykład zostawiłbym następujący wiersz w jakimś wydanym kodzie:

    function doSomething(arg1) {
        // ...
        console.examine("someLabel", arg1);
        // ...
    }

Następnie w wydanym produkcie wpisz następujące polecenie w konsoli (lub pasek adresu z prefiksem „javascript:”):

    top.__examine_someLabel = true;

Następnie zobaczę wszystkie zarejestrowane instrukcje console.examine (). To była fantastyczna pomoc wiele razy.


Dzięki za ten wspaniały pomysł. To było bardzo inspirujące. Od twojej funkcji sprawdzania, nieświadomie przeszedłem do koncepcji zakresu debugowania php. mydebug_on („somescope”), mydebug („somescope”, $ data) itp. Teraz mogę włączyć / wyłączyć selektywne debugowanie i logowanie do kodu php. I tak jak zwykłe programy linuxowe, może zalogować się w standardowy, pełny verbose itp. Naprawdę niezły pomysł!
Johan

3

Proste Internet Explorer 7 i poniżej podkładki który zachowuje linii numeracji dla innych przeglądarek:

/* Console shim */
(function () {
    var f = function () {};
    if (!window.console) {
        window.console = {
            log:f, info:f, warn:f, debug:f, error:f
        };
    }
}());


1

Dalsze udoskonalanie pomysłów Delana i Andru (dlatego ta odpowiedź jest wersją zredagowaną); Konsola.log prawdopodobnie istnieje, podczas gdy inne funkcje mogą nie istnieć, dlatego domyślną mapę należy odwzorować na tę samą funkcję, co konsola.log ....

Możesz napisać skrypt, który tworzy funkcje konsoli, jeśli nie istnieją:

if (!window.console) console = {};
console.log = console.log || function(){};
console.warn = console.warn || console.log;  // defaults to log
console.error = console.error || console.log; // defaults to log
console.info = console.info || console.log; // defaults to log

Następnie skorzystaj z jednego z poniższych:

console.log(...);
console.error(...);
console.info(...);
console.warn(...);

Funkcje te rejestrują różne typy elementów (które można filtrować na podstawie dziennika, informacji, błędu lub ostrzeżenia) i nie powodują błędów, gdy konsola nie jest dostępna. Te funkcje będą działać w konsolach Firebug i Chrome.

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.