Apakah IE9 mendukung console.log, dan apakah ini merupakan fungsi nyata?


209

Dalam keadaan apa window.console.logdidefinisikan di Internet Explorer 9?

Bahkan ketika window.console.logdidefinisikan, window.console.log.applydan window.console.log.calltidak ditentukan. Kenapa ini?

[Pertanyaan terkait untuk IE8: Apa yang terjadi dengan console.log di IE8? .]


3
Lihat pos hebat ini tentang seluk-beluk IE8-9 objek / fungsi konsol: whattheheadsaid.com/2011/04/…
Marc Climent


@MarcCujian tautannya sudah mati
chakeda

@chakeda Saya benci ketika ini terjadi, ada tautan dari arsip web: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Jawaban:


299

Di Internet Explorer 9 (dan 8), consoleobjek hanya terbuka ketika alat pengembang dibuka untuk tab tertentu. Jika Anda menyembunyikan jendela alat pengembang untuk tab itu, consoleobjek tetap terbuka untuk setiap halaman yang Anda navigasi. Jika Anda membuka tab baru, Anda juga harus membuka alat pengembang untuk tab itu agar consoleobjek dapat diekspos.

The consoleobjek bukan bagian dari standar apapun dan perluasan ke Document Object Model. Seperti objek DOM lainnya, itu dianggap sebagai objek host dan tidak diharuskan untuk mewarisi dari Object, maupun metodenya Function, seperti fungsi dan objek asli ECMAScript. Inilah alasannya applydan calltidak ditentukan pada metode-metode itu. Di IE 9, sebagian besar objek DOM ditingkatkan untuk mewarisi dari tipe script ECMAS asli. Karena alat pengembang dianggap sebagai ekstensi untuk IE (meskipun, ekstensi bawaan), mereka jelas tidak menerima perbaikan yang sama dengan DOM lainnya.

Untuk apa nilainya, Anda masih dapat menggunakan beberapa Function.prototypemetode pada consolemetode dengan sedikit bind()sihir:

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

2
Hal yang sama berlaku untuk objek Firebug console.
Marcel Korpel

150
Saya dengan bangga dapat mengatakan bahwa selama bertahun-tahun saya mengembangkan untuk web saya berasumsi konsol.log didukung oleh semua browser utama. Saya hanya menghabiskan waktu sehari untuk mencari tahu mengapa IE9 tidak menyukai skrip saya dan sekarang saya tahu mengapa - ia memiliki console.log pada langkah pertama. Tidak mungkin melakukan debug, karena mengubah mode debug membuat bug ini hilang dalam sekejap: P Terima kasih atas klarifikasi !!
f055

2
Punya masalah yang sama kemarin. Instalasi DebugBar kebetulan membantu saya lebih cepat karena tidak mendefinisikan objek konsol. Jadi ketika saya menyembunyikan konsol IE tetapi tidak DebugBar saya mendapat pesan dari yang terakhir bahwa ada kesalahan JavaScript (konsol tidak didefinisikan).
Simon A. Eugster

Anda seharusnya sudah memeriksa log kesalahan pada saat pertama kali masalah datang kepada Anda di IE @ f055
Lucky Ali

7
Opsi Internet -> Tingkat Lanjut -> Tampilkan pemberitahuan tentang setiap kesalahan skrip. Pengembang web harus selalu membiarkan ini diperiksa di IE. Ini akan memberi tahu Anda tentang konsol, atau fungsi log tidak ditentukan ... tidak dapat mengingat pesan dengan tepat.
Seth Flowers

166

Solusi sederhana untuk masalah console.log ini adalah dengan menentukan yang berikut di awal kode JS Anda:

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

Ini berfungsi untuk saya di semua browser. Ini menciptakan fungsi dummy untuk console.log ketika debugger tidak aktif. Ketika debugger aktif, metode console.log didefinisikan dan dijalankan secara normal.


8
Info lebih lanjut, dan penggantian konsol yang lebih kuat (termasuk metode konsol lainnya) di sini: stackoverflow.com/questions/8002116/…
Zach Lysobey

@ ZachL: Yang mana di beton tepatnya?
hakre


13

Saya tahu ini adalah pertanyaan yang sangat lama tetapi merasa ini menambah alternatif yang berharga tentang bagaimana menangani masalah konsol. Tempatkan kode berikut sebelum panggilan ke konsol. * (Jadi skrip pertama Anda).

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

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


10

console.log hanya ditentukan saat konsol terbuka. Jika Anda ingin memeriksanya dalam kode Anda, pastikan Anda memeriksanya di properti jendela

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

ini melempar pengecualian di IE9 dan tidak akan berfungsi dengan benar. Jangan lakukan ini

if (console) 
    console.log(msg)

6

Setelah membaca artikel dari komentar Marc Cliament di atas, saya sekarang telah mengubah semua fungsi cross-browser console.log serbaguna untuk terlihat seperti ini:

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
JustFunction.prototype.apply.call(console.log, console, arguments);
Victor

@ Viktor pastilah satu-satunya jawaban yang diterima!
Pavel Frankov

0

Saya ingin menyebutkan bahwa IE9 tidak meningkatkan kesalahan jika Anda menggunakan console.log dengan alat pengembang ditutup pada semua versi Windows. Di XP itu ada, tapi di Windows 7 tidak. Jadi jika Anda menjatuhkan dukungan untuk WinXP secara umum, Anda baik-baik saja menggunakan console.log secara langsung.


-1

Bagaimana tentang...

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

1
Ini mungkin solusi yang lumayan dalam beberapa kasus, tetapi Anda belum benar-benar menjawab pertanyaan itu.
pswg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.