Làm cách nào để in thông báo gỡ lỗi trong Bảng điều khiển JavaScript của Google Chrome?


466

Làm cách nào để in thông báo gỡ lỗi trong Bảng điều khiển JavaScript của Google Chrome?

Xin lưu ý rằng Bảng điều khiển JavaScript không giống như Trình gỡ lỗi JavaScript; chúng có các cú pháp khác nhau AFAIK, vì vậy lệnh in trong JavaScript Debugger sẽ không hoạt động ở đây. Trong Bảng điều khiển JavaScript, print()sẽ gửi tham số đến máy in.

Câu trả lời:


597

Thực thi mã sau từ thanh địa chỉ trình duyệt:

javascript: console.log (2);

in thành công tin nhắn đến "Bảng điều khiển JavaScript" trong Google Chrome.


13
Chỉ cần nhận ra, console.log()là tuyệt vời cho js gỡ lỗi ... Tôi thường quên sử dụng nó trong thực tế.
Ish

Một trong những "đầu ra" này có thể kéo dài bao lâu? Nhân tiện, điều này thực sự hữu ích
nbura

3
@dbrin điều này tốt cho phát triển, tuy nhiên bất kỳ console.log()mã nào cũng cần được xóa khỏi mã sản xuất trước khi triển khai.
Samuel MacLachlan

2
@Sebas Console.Lognên được xóa khỏi mã sản xuất trước khi triển khai vì nếu không, các thông báo này sẽ đăng nhập vào bảng điều khiển JavaScript của người dùng của bạn. Mặc dù họ không thể nhìn thấy nó, nhưng nó đang chiếm dung lượng bộ nhớ trên thiết bị của họ. Ngoài ra, tùy thuộc vào nội dung của Nhật ký, bạn có khả năng cho mọi người biết cách hack / đảo ngược kỹ sư ứng dụng của bạn.
Samuel MacLachlan

166

Cải thiện ý tưởng của Andru, bạn có thể viết một tập lệnh tạo các chức năng của bàn điều khiển nếu chúng không tồn tại:

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

Sau đó, sử dụng bất kỳ sau đây:

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

Các chức năng này sẽ ghi nhật ký các loại mục khác nhau (có thể được lọc dựa trên nhật ký, thông tin, lỗi hoặc cảnh báo) và sẽ không gây ra lỗi khi bảng điều khiển không khả dụng. Các chức năng này sẽ hoạt động trong bảng điều khiển Fireorms và Chrome.


Cảm ơn vì điều đó. Mã sẽ không chặt chẽ hơn nếu bạn chạy "nếu" một lần, thích if (!window.console) {và sau đó đặt mọi thứ trong ngoặc? Ngay bây giờ bạn đang đánh giá cùng một thứ bốn lần.
Dan Rosenstark

Không, b / c chỉ có window.console không đảm bảo rằng bạn sẽ có window.console.log hoặc .warn & c
Paul

18
Hãy cẩn thận vì nếu tập lệnh này được tải với trang và cửa sổ giao diện điều khiển không mở, nó sẽ tạo ra bàn điều khiển 'giả' có thể ngăn giao diện điều khiển thực hoạt động nếu bạn mở bàn điều khiển sau khi trang được tải. (ít nhất đây là trường hợp trong các phiên bản cũ hơn của firefox / fireorms và chrome)
cwd

1
Tôi có bổ sung cho điều này, xem câu trả lời của tôi dưới đây
Tim Büthe

1
Không, điều này sẽ không khiến chrome hủy bỏ với TypeError. Câu hỏi liên kết ở trên là về việc gọi với điều này . Đoạn mã trên không làm được điều đó và sẽ hoạt động tốt trong Chrome
gman

47

Chỉ cần thêm một tính năng thú vị mà rất nhiều nhà phát triển bỏ lỡ:

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

Đây là kỳ diệu %obãi nhấp được và sâu có thể xem nội dung của một đối tượng JavaScript. %sđã được hiển thị chỉ cho một hồ sơ.

Ngoài ra điều này cũng mát mẻ:

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

Cung cấp một dấu vết ngăn xếp giống như Java đến điểm của lệnh new Error()gọi (bao gồm đường dẫn đến tệp và số dòng !).

Cả hai %onew Error().stackđều có sẵn trong Chrome và Firefox!

Ngoài ra đối với dấu vết ngăn xếp trong Firefox sử dụng:

console.trace();

Như https://developer.mozilla.org/en-US/docs/Web/API/console nói.

Chúc mừng hack!

CẬP NHẬT : Một số thư viện được viết bởi những người xấu xác định lại consoleđối tượng cho mục đích riêng của họ. Để khôi phục trình duyệt gốc consolesau khi tải thư viện, hãy sử dụng:

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

Xem câu hỏi Stack Overflow Khôi phục console.log () .


3
Một cái khác tôi mới phát hiện ra: console.dir developer.mozilla.org/en-US/docs/Web/API/console.dir
dbrin

17

Chỉ cần một cảnh báo nhanh - nếu bạn muốn kiểm tra trong Internet Explorer mà không xóa tất cả các console.log (), bạn sẽ cần sử dụng Fireorms Lite hoặc bạn sẽ gặp một số lỗi không thân thiện đặc biệt.

(Hoặc tạo console.log () của riêng bạn, nó sẽ trả về false.)


2
Tôi tránh các lỗi trình duyệt chéo như vậy: if (console) console.log ()
Craig Wohlfeil

Nếu bạn mở các công cụ dành cho nhà phát triển trong IE (F12), consoleđối tượng sẽ được tạo và tồn tại cho đến khi bạn đóng phiên bản trình duyệt đó.
Tim Büthe

17

Đây là một đoạn script ngắn để kiểm tra xem bàn điều khiển có sẵn không. Nếu không, nó sẽ cố gắng tải Fireorms và nếu Firebird không có sẵn, nó sẽ tải Fireorms Lite. Bây giờ bạn có thể sử dụng console.logtrong bất kỳ trình duyệt. Thưởng thức!

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

Ngoài câu trả lời của Delan Azabani , tôi muốn chia sẻ console.jsvà tôi sử dụng cho cùng một mục đích. Tôi tạo một bảng điều khiển noop bằng cách sử dụng một loạt các tên hàm, theo ý kiến ​​của tôi là một cách rất thuận tiện để làm điều này và tôi đã chăm sóc Internet Explorer, có một console.logchức năng, nhưng không 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

Hoặc sử dụng chức năng này:

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

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

7

Đây là lớp bọc giao diện điều khiển của tôi. Nó cho tôi phạm vi đầu ra là tốt để làm cho cuộc sống dễ dàng hơn. Lưu ý việc sử dụng localConsole.debug.call()để localConsole.debugchạy trong phạm vi của lớp gọi, cung cấp quyền truy cập vào toStringphương thức của nó .

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

Điều này mang lại đầu ra như vậy trong Fireorms :

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

Hoặc Chrome:

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

6

Cá nhân tôi sử dụng cái này, tương tự như của tarek11011:

// 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){}
}

Điểm chính là ít nhất nên có một số thực hành ghi nhật ký ngoài việc chỉ sử dụng console.log()mã JavaScript của bạn, bởi vì nếu bạn quên nó và trên trang web sản xuất, nó có khả năng phá vỡ tất cả mã JavaScript cho trang đó


tại sao không if(windows.console) console.log(msg)?
CJStuart

window.consoleý bạn là. lần duy nhất thử sẽ hữu ích là nếu một lỗi được ném (nếu console.log không phải là một chức năng) vì giao diện điều khiển được xác định lại. Làm window.console && window.console.log instanceof Functionsẽ có ích hơn.
Aram Kocharyan

4

Bạn có thể sử dụng console.log()nếu bạn có mã gỡ lỗi trong trình chỉnh sửa phần mềm lập trình nào bạn có và bạn sẽ thấy đầu ra có khả năng là trình chỉnh sửa tốt nhất cho tôi (Google Chrome). Chỉ cần nhấn F12và nhấn tab Console. Bạn sẽ thấy kết quả. Chúc mừng mã hóa. :)


4

Tôi đã có rất nhiều vấn đề với các nhà phát triển kiểm tra trong bảng điều khiển của họ. (). Và, tôi thực sự không thích gỡ lỗi Internet Explorer, mặc dù có những cải tiến tuyệt vời của Internet Explorer 10Visual Studio 2012 , v.v.

Vì vậy, tôi đã ghi đè chính đối tượng giao diện điều khiển ... Tôi đã thêm một cờ __localhost chỉ cho phép các câu lệnh giao diện điều khiển khi trên localhost. Tôi cũng đã thêm các chức năng console. () Vào Internet Explorer (thay vào đó sẽ hiển thị cảnh báo ()).

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

Ví dụ sử dụng:

    console.log("hello");

Chrome / Firefox:

    prints hello in the console window.

Trình duyệt web IE:

    displays an alert with 'hello'.

Đối với những người nhìn kỹ vào mã, bạn sẽ khám phá hàm console.examine (). Tôi đã tạo ra cách đây nhiều năm để tôi có thể để mã gỡ lỗi ở một số khu vực nhất định xung quanh sản phẩm để giúp khắc phục sự cố QA / khách hàng. Chẳng hạn, tôi sẽ để lại dòng sau trong một số mã được phát hành:

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

Và sau đó từ sản phẩm được phát hành, nhập nội dung sau vào bảng điều khiển (hoặc thanh địa chỉ có tiền tố 'javascript:'):

    top.__examine_someLabel = true;

Sau đó, tôi sẽ thấy tất cả các câu lệnh console.examine () đã đăng nhập. Đó là một sự giúp đỡ tuyệt vời nhiều lần.


Cảm ơn ý tưởng tuyệt vời này. Đã khá truyền cảm. Từ chức năng kiểm tra của bạn, tôi vô tình đi đến ý tưởng về phạm vi để gỡ lỗi php. mydebug_on ('somescope'), mydebug ('somescope', $ data), v.v ... Bây giờ tôi có thể bật / tắt gỡ lỗi chọn lọc chủ đề và đăng nhập mã php. Và giống như các chương trình linux thông thường, nó có thể đăng nhập vào một hương vị verbose thông thường tiêu chuẩn. Thực sự là một ý tưởng hay!
Johan

3

Simple Internet Explorer 7 và dưới shim rằng bảo tồn dòng đánh số cho các trình duyệt khác:

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

2
console.debug("");

Sử dụng phương pháp này sẽ in ra văn bản có màu xanh sáng trong bảng điều khiển.

nhập mô tả hình ảnh ở đây


1

Cải thiện hơn nữa về ý tưởng của Delan và Andru (đó là lý do tại sao câu trả lời này là phiên bản chỉnh sửa); console.log có khả năng tồn tại trong khi các chức năng khác có thể không tồn tại, do đó, có bản đồ mặc định cho cùng chức năng với console.log ....

Bạn có thể viết một tập lệnh tạo các chức năng của bàn điều khiển nếu chúng không tồn tại:

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

Sau đó, sử dụng bất kỳ sau đây:

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

Các chức năng này sẽ ghi nhật ký các loại mục khác nhau (có thể được lọc dựa trên nhật ký, thông tin, lỗi hoặc cảnh báo) và sẽ không gây ra lỗi khi bảng điều khiển không khả dụng. Các chức năng này sẽ hoạt động trong bảng điều khiển Fireorms và Chrome.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.