IE9 có hỗ trợ console.log không, và nó có phải là một chức năng thực sự không?


209

Trong trường hợp nào được window.console.logxác định trong Internet Explorer 9?

Ngay cả khi window.console.logđược xác định, window.console.log.applywindow.console.log.callkhông xác định. Tại sao lại thế này?

[Câu hỏi liên quan cho IE8: Điều gì đã xảy ra với console.log trong IE8? .]


3
Kiểm tra bài đăng tuyệt vời này về sự phức tạp của đối tượng / chức năng của bảng điều khiển IE8-9
Marc Climent


@MarcCliment liên kết đã chết
chaineda

@chakeda Tôi ghét khi điều này xảy ra, có các liên kết từ các kho lưu trữ web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/...
Marc Climent

Câu trả lời:


299

Trong Internet Explorer 9 (và 8), consoleđối tượng chỉ được hiển thị khi các công cụ dành cho nhà phát triển được mở cho một tab cụ thể. Nếu bạn ẩn cửa sổ công cụ dành cho nhà phát triển cho tab đó, consoleđối tượng vẫn được hiển thị cho mỗi trang bạn điều hướng đến. Nếu bạn mở một tab mới, bạn cũng phải mở các công cụ dành cho nhà phát triển cho tab đó để consoleđối tượng được hiển thị.

Đối consoletượng không phải là một phần của bất kỳ tiêu chuẩn nào và là một phần mở rộng cho Mô hình Đối tượng Tài liệu. Giống như các đối tượng DOM khác, nó được coi là một đối tượng máy chủ và không bắt buộc phải kế thừa từ Object, cũng như các phương thức của nó Function, giống như các hàm và đối tượng ECMAScript gốc. Đây là lý do applycallkhông được xác định trên các phương pháp đó. Trong IE 9, hầu hết các đối tượng DOM đã được cải thiện để kế thừa từ các loại ECMAScript gốc. Vì các công cụ dành cho nhà phát triển được coi là một phần mở rộng cho IE (mặc dù là phần mở rộng tích hợp), rõ ràng chúng không nhận được những cải tiến giống như phần còn lại của DOM.

Để biết giá trị của nó, bạn vẫn có thể sử dụng một số Function.prototypephương pháp trên consolecác phương thức với một chút bind()phép thuật:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"

2
Điều này cũng đúng với consoleđối tượng của Fireorms .
Marcel Korpel

150
Tôi không thể tự hào nói rằng trong nhiều năm tôi đã phát triển cho web, tôi giả sử console.log được hỗ trợ bởi tất cả các trình duyệt chính. Tôi mới dành một ngày để tìm hiểu lý do tại sao IE9 không thích kịch bản của tôi và bây giờ tôi biết tại sao - nó đã có console.log trong bước đầu tiên. Không thể gỡ lỗi, vì chuyển chế độ gỡ lỗi đã khiến lỗi này biến mất ngay lập tức: P Cảm ơn đã làm rõ !!
f055

2
Có vấn đề tương tự ngày hôm qua. Cài đặt DebugBar đã giúp tôi nhanh hơn vì nó không xác định đối tượng giao diện điều khiển. Vì vậy, khi tôi ẩn bảng điều khiển IE nhưng không phải là DebugBar, tôi nhận được một thông báo từ đó rằng có lỗi JavaScript (bảng điều khiển không được xác định).
Simon A. Eugster

bạn nên kiểm tra nhật ký lỗi ngay lần đầu tiên sự cố xảy ra với bạn trên IE @ f055
Lucky Ali

7
Tùy chọn Internet -> Nâng cao -> Hiển thị thông báo về mọi lỗi tập lệnh. Các nhà phát triển web phải luôn luôn kiểm tra điều này trong IE. Điều này sẽ thông báo cho bạn về bảng điều khiển hoặc chức năng nhật ký không được xác định ... không thể nhớ chính xác thông báo.
Hoa Seth

166

Một giải pháp đơn giản cho vấn đề console.log này là xác định các mục sau ở đầu mã JS của bạn:

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

Điều này làm việc cho tôi trong tất cả các trình duyệt. Điều này tạo ra một hàm giả cho console.log khi trình gỡ lỗi không hoạt động. Khi trình gỡ lỗi hoạt động, phương thức console.log được xác định và thực thi bình thường.


8
Thêm thông tin và thay thế bảng điều khiển mạnh mẽ hơn (bao gồm các phương thức bảng điều khiển khác) tại đây: stackoverflow.com/questions/8002116/
mẹo

@ZachL: Cái nào trong bê tông chính xác?
hakre

Câu trả lời của tôi có một cách tiếp cận: stackoverflow.com/a/15771110/363701 . Ngoài ra, hãy kiểm tra điều này: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey

13

Tôi biết đây là một câu hỏi rất cũ nhưng cảm thấy điều này bổ sung một giải pháp thay thế có giá trị về cách giải quyết vấn đề giao diện điều khiển. Đặt mã sau đây trước bất kỳ cuộc gọi nào đến bàn điều khiển. * (Vì vậy tập lệnh đầu tiên của bạn).

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

Tham khảo:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js


10

console.log chỉ được xác định khi giao diện điều khiển mở. Nếu bạn muốn kiểm tra nó trong mã của bạn, hãy đảm bảo bạn kiểm tra nó trong thuộc tính cửa sổ

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

điều này ném một ngoại lệ trong IE9 và sẽ không hoạt động chính xác. Đừng làm điều này

if (console) 
    console.log(msg)

6

Sau khi đọc bài viết từ bình luận của Marc Cliament ở trên, giờ đây tôi đã thay đổi chức năng console.log đa mục đích đa năng của mình thành như thế này:

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
Chỉ cầnFunction.prototype.apply.call(console.log, console, arguments);
Victor

@Victor nó chắc chắn nên là câu trả lời duy nhất được chấp nhận!
Pavel Frankov 11/03/2015

0

Tôi muốn đề cập rằng IE9 không gây ra lỗi nếu bạn sử dụng console.log với các công cụ dành cho nhà phát triển đã đóng trên tất cả các phiên bản Windows. Trên XP thì có, nhưng trên Windows 7 thì không. Vì vậy, nếu bạn bỏ hỗ trợ cho WinXP nói chung, bạn sẽ sử dụng console.log trực tiếp.


-1

Làm thế nào về...

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

1
Đây có thể là một cách giải quyết có thể vượt qua trong một số trường hợp, nhưng bạn thực sự chưa giải quyết được câu hỏi.
pswg
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.