'konsol' adalah kesalahan yang tidak terdefinisi untuk Internet Explorer

375

Saya menggunakan Firebug dan memiliki beberapa pernyataan seperti:

console.log("...");

di halaman saya. Di IE8 (mungkin versi sebelumnya juga) saya mendapatkan kesalahan skrip yang mengatakan 'konsol' tidak terdefinisi. Saya mencoba meletakkan ini di bagian atas halaman saya:

<script type="text/javascript">
    if (!console) console = {log: function() {}};
</script>

masih saya mendapatkan kesalahan. Adakah cara untuk menghilangkan kesalahan?

pengguna246114
sumber
4
Gunakan typeofdi if Anda, itu akan menghindari kesalahan yang tidak ditentukan: if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Flak DiNenno
21
console.log () hanya berfungsi ketika alat dev IE terbuka (ya IE jelek). lihat stackoverflow.com/questions/7742781/…
Adrien Be
1
Jawaban terbaik untuk pertanyaan itu adalah stackoverflow.com/a/16916941/2274855
Vinícius Moraes
1
Tautan @Arillion terputus, gunakan yang ini sebagai gantinya: github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Alfred Bez

Jawaban:

378

Mencoba

if (!window.console) console = ...

Variabel tidak terdefinisi tidak dapat dirujuk secara langsung. Namun, semua variabel global adalah atribut dengan nama yang sama dari konteks global ( windowdalam hal browser), dan mengakses atribut yang tidak ditentukan adalah baik-baik saja.

Atau gunakan if (typeof console === 'undefined') console = ...jika Anda ingin menghindari variabel ajaib window, lihat jawaban @Tim Down .

kennytm
sumber
160
Supaya jelas bagi siapa pun yang menggunakan ini, letakkan <script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>di bagian atas halaman Anda! Terima kasih, Kenny.
windowsgm
11
Bagaimana denganvar console = console || { log: function() {} };
devlord
9
@lorddev Untuk menggunakan singkatan itu, Anda harus menyertakan window:var console = window.console || { log: function() {} };
jlengstorf
64
Sial ... Anda membangun situs web yang bagus, mengembangkannya untuk peramban favorit Anda. Pada akhirnya Anda menghabiskan 4-5 JAM membuatnya kompatibel dengan semua browser MODERN lainnya, dan kemudian Anda menghabiskan 4-5 HARI membuatnya kompatibel dengan IE.
Israel
6
Masalah dengan jawaban itu adalah jika Anda menggunakan nama lain seperti men-debug, memperingatkan, menghitung dengan browser yang tidak memiliki konsol akan mengeluarkan pengecualian melihat cara yang lebih baik untuk melakukan itu stackoverflow.com/a/16916941/2274855
Vinícius Moraes
319

Rekatkan yang berikut di bagian atas JavaScript Anda (sebelum menggunakan konsol):

/**
 * Protect window.console method calls, e.g. console is not defined on IE
 * unless dev tools are open, and IE doesn't define console.debug
 * 
 * Chrome 41.0.2272.118: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 * Firefox 37.0.1: log,info,warn,error,exception,debug,table,trace,dir,group,groupCollapsed,groupEnd,time,timeEnd,profile,profileEnd,assert,count
 * Internet Explorer 11: select,log,info,warn,error,debug,assert,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd,trace,clear,dir,dirxml,count,countReset,cd
 * Safari 6.2.4: debug,error,log,info,warn,clear,dir,dirxml,table,trace,assert,count,profile,profileEnd,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd
 * Opera 28.0.1750.48: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 */
(function() {
  // Union of Chrome, Firefox, IE, Opera, and Safari console methods
  var methods = ["assert", "cd", "clear", "count", "countReset",
    "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed",
    "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd",
    "select", "table", "time", "timeEnd", "timeStamp", "timeline",
    "timelineEnd", "trace", "warn"];
  var length = methods.length;
  var console = (window.console = window.console || {});
  var method;
  var noop = function() {};
  while (length--) {
    method = methods[length];
    // define undefined methods as noops to prevent errors
    if (!console[method])
      console[method] = noop;
  }
})();

Wrapper penutupan fungsi adalah untuk lingkup variabel untuk tidak mendefinisikan variabel apa pun. Ini melindungi terhadap tidak terdefinisi consoledan tidak terdefinisi console.debug(dan metode lain yang hilang).

EDIT: Saya perhatikan bahwa HTML5 Boilerplate menggunakan kode serupa di file js / plugins.js, jika Anda mencari solusi yang (mungkin) akan terus diperbarui.

Peter Tseng
sumber
14
Mengapa jawaban ini begitu sedikit hasilnya? Ini adalah yang paling lengkap dari yang diposting di sini.
mavilein
Karena tanggal. Sepenuhnya setuju dengan solusi kerja yang benar. Saya pikir topik ini perlu dimoderasi. Maaf untuk bahasa Inggris yang buruk.
woto
Cukup lengkap kecuali bahwa itu tidak akan mencoba mengarahkan kembali log ke fungsi log (jika ada) sehingga semua log hilang
Christophe Roussy
5
Kapan tepatnya ini terjadi? Kode ini seharusnya hanya mendefinisikan elemen-elemen yang belum didefinisikan.
Peter Tseng
4
Saya pikir salah satu cara - (function () {...} ()) atau (function () {...}) () - benar
Peter Tseng
73

Alternatif lain adalah typeofoperator:

if (typeof console == "undefined") {
    this.console = {log: function() {}};
}

Alternatif lain adalah dengan menggunakan perpustakaan logging, seperti log4javascript saya sendiri .

Tim Down
sumber
Akan lebih baik jika mengubah penugasan yang tidak diumumkan menjadi deklarasi yang tepat.
kangax
1
Apakah maksud Anda menggunakan var? Itu hanya akan membingungkan hal-hal di sini. Atau maksud Anda menugaskan ke window.consolebukan console?
Tim Down
Menggunakan var. Mengapa hal itu membingungkan di sini?
kangax
2
Diskusi yang membingungkan. +1 hingga jawaban asli. Jika saya bisa memberi +2 saya akan memberikan tautan kepada Anda sendiri log4javascript. Terima kasih OP!
Jay Taylor
8
@yckart: Tidak. typeofDijamin untuk mengembalikan string dan "undefined"string. Ketika kedua operan memiliki tipe yang sama, ==dan ===ditentukan untuk melakukan langkah yang persis sama. Menggunakan typeof x == "undefined"adalah cara yang solid untuk menguji apakah xtidak terdefinisi dalam lingkup apa pun dan lingkungan yang sesuai dengan ECMAScript 3.
Tim Down
47

Untuk solusi yang lebih kuat, gunakan kode ini (diambil dari kode sumber twitter):

// 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;
        }
    }
}());
Vinícius Moraes
sumber
13

Dalam skrip saya, saya juga menggunakan steno:

window.console && console.log(...) // only log if the function exists

atau, jika tidak mungkin atau tidak layak untuk mengedit setiap baris console.log, saya membuat konsol palsu:

// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing. 
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});
iblamefish
sumber
2
Kesalahan sintaks. Mengapa tidak adilif(!console) {console = {} ; console.log = function(){};}
Meekohi
1
Atau tidak hanya!window.console && (window.console = { log: function () { } });
Maksim Vi.
10

Anda dapat menggunakan IE8 console.log()jika telah Developer Toolsdibuka dan Anda juga dapat menggunakan Consolekotak teks pada tab skrip.


sumber
7
Ini tidak baik jika Anda lupa untuk menyapu kode konsol. Kesalahan dalam IE8 akan mencegah kode JS Anda bekerja
yunzen
7
if (typeof console == "undefined") {
  this.console = {
    log: function() {},
    info: function() {},
    error: function() {},
    warn: function() {}
  };
}
lambang
sumber
1
peringatan emptor: ini harus didefinisikan pada tingkat global di mana thismengacu window.
Sgnl
7

Berdasarkan dua jawaban sebelumnya oleh

dan dokumentasi untuk

Inilah implementasi upaya terbaik untuk masalah ini, artinya jika ada console.log yang benar-benar ada, ini mengisi celah untuk metode yang tidak ada melalui console.log.

Misalnya untuk IE6 / 7 Anda dapat mengganti logging dengan waspada (bodoh tapi berfungsi) dan kemudian memasukkan monster di bawah ini (saya menyebutnya console.js): [Jangan ragu untuk menghapus komentar sesuai keinginan, saya meninggalkannya untuk referensi, minimizer dapat mengatasinya]:

<!--[if lte IE 7]>
<SCRIPT LANGUAGE="javascript">
    (window.console = window.console || {}).log = function() { return window.alert.apply(window, arguments); };
</SCRIPT>
<![endif]-->
<script type="text/javascript" src="console.js"></script>

dan console.js:

    /**
     * Protect window.console method calls, e.g. console is not defined on IE
     * unless dev tools are open, and IE doesn't define console.debug
     */
    (function() {
        var console = (window.console = window.console || {});
        var noop = function () {};
        var log = console.log || noop;
        var start = function(name) { return function(param) { log("Start " + name + ": " + param); } };
        var end = function(name) { return function(param) { log("End " + name + ": " + param); } };

        var methods = {
            // Internet Explorer (IE 10): http://msdn.microsoft.com/en-us/library/ie/hh772169(v=vs.85).aspx#methods
            // assert(test, message, optionalParams), clear(), count(countTitle), debug(message, optionalParams), dir(value, optionalParams), dirxml(value), error(message, optionalParams), group(groupTitle), groupCollapsed(groupTitle), groupEnd([groupTitle]), info(message, optionalParams), log(message, optionalParams), msIsIndependentlyComposed(oElementNode), profile(reportName), profileEnd(), time(timerName), timeEnd(timerName), trace(), warn(message, optionalParams)
            // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "msIsIndependentlyComposed", "profile", "profileEnd", "time", "timeEnd", "trace", "warn"

            // Safari (2012. 07. 23.): https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html#//apple_ref/doc/uid/TP40007874-CH8-SW20
            // assert(expression, message-object), count([title]), debug([message-object]), dir(object), dirxml(node), error(message-object), group(message-object), groupEnd(), info(message-object), log(message-object), profile([title]), profileEnd([title]), time(name), markTimeline("string"), trace(), warn(message-object)
            // "assert", "count", "debug", "dir", "dirxml", "error", "group", "groupEnd", "info", "log", "profile", "profileEnd", "time", "markTimeline", "trace", "warn"

            // Firefox (2013. 05. 20.): https://developer.mozilla.org/en-US/docs/Web/API/console
            // debug(obj1 [, obj2, ..., objN]), debug(msg [, subst1, ..., substN]), dir(object), error(obj1 [, obj2, ..., objN]), error(msg [, subst1, ..., substN]), group(), groupCollapsed(), groupEnd(), info(obj1 [, obj2, ..., objN]), info(msg [, subst1, ..., substN]), log(obj1 [, obj2, ..., objN]), log(msg [, subst1, ..., substN]), time(timerName), timeEnd(timerName), trace(), warn(obj1 [, obj2, ..., objN]), warn(msg [, subst1, ..., substN])
            // "debug", "dir", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "time", "timeEnd", "trace", "warn"

            // Chrome (2013. 01. 25.): https://developers.google.com/chrome-developer-tools/docs/console-api
            // assert(expression, object), clear(), count(label), debug(object [, object, ...]), dir(object), dirxml(object), error(object [, object, ...]), group(object[, object, ...]), groupCollapsed(object[, object, ...]), groupEnd(), info(object [, object, ...]), log(object [, object, ...]), profile([label]), profileEnd(), time(label), timeEnd(label), timeStamp([label]), trace(), warn(object [, object, ...])
            // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "profile", "profileEnd", "time", "timeEnd", "timeStamp", "trace", "warn"
            // Chrome (2012. 10. 04.): https://developers.google.com/web-toolkit/speedtracer/logging-api
            // markTimeline(String)
            // "markTimeline"

            assert: noop, clear: noop, trace: noop, count: noop, timeStamp: noop, msIsIndependentlyComposed: noop,
            debug: log, info: log, log: log, warn: log, error: log,
            dir: log, dirxml: log, markTimeline: log,
            group: start('group'), groupCollapsed: start('groupCollapsed'), groupEnd: end('group'),
            profile: start('profile'), profileEnd: end('profile'),
            time: start('time'), timeEnd: end('time')
        };

        for (var method in methods) {
            if ( methods.hasOwnProperty(method) && !(method in console) ) { // define undefined methods as best-effort methods
                console[method] = methods[method];
            }
        }
    })();
TWiStErRob
sumber
Saya tidak yakin apakah kita perlu methods.hasOwnProperty(method) && di loop for.
TWiStErRob
Saya yakin Anda memang membutuhkannya.
ErikE
Lakukan tes cepat di konsol Chrome: > x = { a: 1, b: 2}-> Object {a: 1, b: 2}dan for(var f in x) {console.log(f + " " + x[f]);} 'end'-> a 1 b 2 "end". Jadi objek anonim yang dibuat tidak memiliki properti tambahan, dan methodsbaru saja dibuat sebelum forloop. Apakah mungkin untuk meretas di atas?
TWiStErRob
3
Iya. var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}Anda tidak pernah tahu apa yang telah dilakukan perpustakaan terhadap objek dalam rantai pewarisan objek yang Anda kerjakan. Demikian rekomendasi oleh alat kode kualitas javascript seperti jshint dan jslint untuk digunakan hasOwnProperty.
ErikE
6

Di IE9, jika konsol tidak dibuka, kode ini:

alert(typeof console);

akan menampilkan "objek", tetapi kode ini

alert(typeof console.log);

akan mengeluarkan pengecualian TypeError, tetapi tidak mengembalikan nilai yang tidak ditentukan;

Jadi, versi kode yang dijamin akan terlihat seperti ini:

try {
    if (window.console && window.console.log) {
        my_console_log = window.console.log;
    }
} catch (e) {
    my_console_log = function() {};
}
bonbonez
sumber
6

Saya hanya menggunakan console.log dalam kode saya. Jadi saya menyertakan 2 liner yang sangat pendek

var console = console || {};
console.log = console.log || function(){};
Ruben Decrop
sumber
1
Bagaimana ini bekerja ... Saya tidak melihat baris console.log dicetak ke browser IE, saya telah menguji dengan 2 sistem yang berbeda di mana dalam 1 - console.log bekerja dan 2 sistem tidak. saya mencoba keduanya tetapi tidak dapat melihat log di kedua sistem.
kiran
2

Melihat bahwa OP menggunakan Firebug dengan IE, maka anggaplah itu Firebug Lite . Ini adalah situasi yang funky karena konsol didefinisikan di IE saat jendela debugger dibuka, tetapi apa yang terjadi ketika Firebug sudah berjalan? Tidak yakin, tapi mungkin metode "firebugx.js" mungkin cara yang baik untuk menguji dalam situasi ini:

sumber:

https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187

    if (!window.console || !console.firebug) {
        var names = [
            "log", "debug", "info", "warn", "error", "assert",
            "dir","dirxml","group","groupEnd","time","timeEnd",
            "count","trace","profile","profileEnd"
        ];
        window.console = {};
        for (var i = 0; i < names.length; ++i)
            window.console[names[i]] = function() {}
    }

(tautan yang diperbarui 12/2014)

Roberto
sumber
1

Saya menggunakan fauxconsole ; Saya memodifikasi css sedikit sehingga terlihat lebih bagus tetapi bekerja dengan sangat baik.

Stijn Geukens
sumber
1

Untuk debugging di IE, lihat log4javascript ini

Praveen
sumber
Ini bagus, terutama karena konsol IE8 saya tidak menghasilkan apa-apa.
Firsh - LetsWP.io
1
@ Firma Terima kasih atas komentar Anda.
Praveen
1
Saya sedang mencari komentar pada pertanyaan lain di sini yang mengatakan 'promosi diri yang tidak tahu malu' atau saya tidak tahu - mirip - seseorang yang mengatakan dia menciptakan skrip ini, bukan? Saya sudah menutup tab itu. Pokoknya itu alat yang sangat hebat dan sangat berguna untuk proyek saya.
Firsh - LetsWP.io
1
@ Firasat Saya tidak membuat skrip ini, saya orang seperti Anda diuntungkan menggunakan alat.
Praveen
1

Untuk IE8 atau dukungan konsol terbatas pada console.log (tanpa debug, lacak, ...) Anda dapat melakukan hal berikut:

  • Jika konsol ATAU console.log tidak terdefinisi: Buat fungsi dummy untuk fungsi konsol (lacak, debug, log, ...)

    window.console = { debug : function() {}, ...};

  • Lain jika console.log didefinisikan (IE8) DAN console.debug (lainnya) tidak didefinisikan: redirect semua fungsi logging ke console.log, ini memungkinkan untuk menyimpan log tersebut!

    window.console = { debug : window.console.log, ...};

Tidak yakin tentang dukungan tegas dalam berbagai versi IE, tetapi ada saran dipersilahkan. Diposting juga jawaban ini di sini: Bagaimana saya bisa menggunakan logging konsol di Internet Explorer?

Christophe Roussy
sumber
1
console = console || { 
    debug: function(){}, 
    log: function(){}
    ...
}
David Glass
sumber
1

Rintisan konsol dalam TypeScript:

if (!window.console) {
console = {
    assert: () => { },
    clear: () => { },
    count: () => { },
    debug: () => { },
    dir: () => { },
    dirxml: () => { },
    error: () => { },
    group: () => { },
    groupCollapsed: () => { },
    groupEnd: () => { },
    info: () => { },
    log: () => { },
    msIsIndependentlyComposed: (e: Element) => false,
    profile: () => { },
    profileEnd: () => { },
    select: () => { },
    time: () => { },
    timeEnd: () => { },
    trace: () => { },
    warn: () => { },
    }
};
gdbdable
sumber
0

Anda dapat menggunakan yang di bawah ini untuk memberikan tingkat asuransi tambahan yang telah Anda dapatkan dari semua pangkalan. Penggunaan typeofpertama akan menghindari undefinedkesalahan. Menggunakan ===juga akan memastikan bahwa nama tipe sebenarnya adalah string "tidak terdefinisi". Terakhir, Anda ingin menambahkan parameter ke tanda tangan fungsi (saya pilih secara logMsgsewenang-wenang) untuk memastikan konsistensi, karena Anda meneruskan apa pun yang ingin Anda cetak ke konsol ke fungsi log. Ini juga membuat Anda sangat akurat dan menghindari segala peringatan / kesalahan dalam IDE JS aware Anda.

if(!window.console || typeof console === "undefined") {
  var console = { log: function (logMsg) { } };
}
Flak DiNenno
sumber
0

Mengalami masalah serupa menjalankan console.log di windows anak di IE9, dibuat oleh fungsi window.open.

Tampaknya dalam hal ini konsol hanya ditentukan di jendela induk dan tidak ditentukan di jendela anak hingga Anda menyegarkannya. Hal yang sama berlaku untuk anak-anak dari windows anak.

Saya menangani masalah ini dengan membungkus log di fungsi berikutnya (di bawah ini adalah bagian dari modul)

getConsole: function()
    {
        if (typeof console !== 'undefined') return console;

        var searchDepthMax = 5,
            searchDepth = 0,
            context = window.opener;

        while (!!context && searchDepth < searchDepthMax)
        {
            if (typeof context.console !== 'undefined') return context.console;

            context = context.opener;
            searchDepth++;
        }

        return null;
    },
    log: function(message){
        var _console = this.getConsole();
        if (!!_console) _console.log(message);
    }
Max Venediktov
sumber
-2

Setelah mengalami begitu banyak masalah dengan hal ini (sulit untuk men-debug kesalahan karena jika Anda membuka konsol pengembang kesalahan tidak lagi terjadi!) Saya memutuskan untuk membuat kode berlebihan untuk tidak perlu repot dengan ini lagi:

if (typeof window.console === "undefined")
    window.console = {};

if (typeof window.console.debug === "undefined")
    window.console.debug= function() {};

if (typeof window.console.log === "undefined")
    window.console.log= function() {};

if (typeof window.console.error === "undefined")
    window.console.error= function() {alert("error");};

if (typeof window.console.time === "undefined")
    window.console.time= function() {};

if (typeof window.console.trace === "undefined")
    window.console.trace= function() {};

if (typeof window.console.info === "undefined")
    window.console.info= function() {};

if (typeof window.console.timeEnd === "undefined")
    window.console.timeEnd= function() {};

if (typeof window.console.group === "undefined")
    window.console.group= function() {};

if (typeof window.console.groupEnd === "undefined")
    window.console.groupEnd= function() {};

if (typeof window.console.groupCollapsed === "undefined")
    window.console.groupCollapsed= function() {};

if (typeof window.console.dir === "undefined")
    window.console.dir= function() {};

if (typeof window.console.warn === "undefined")
    window.console.warn= function() {};

Secara pribadi saya hanya pernah menggunakan console.log dan console.error, tetapi kode ini menangani semua fungsi lain seperti yang ditunjukkan di Mozzila Developer Network: https://developer.mozilla.org/en-US/docs/Web/API/console . Cukup taruh kode itu di bagian atas halaman Anda dan Anda selesai selamanya dengan ini.

Hoffmann
sumber
-11

Anda dapat menggunakan console.log (...) langsung di Firefox tetapi tidak di IEs. Di IEs Anda harus menggunakan window.console.

Mohit Kumar
sumber
11
console.log dan window.console.log merujuk ke fungsi yang sama di browser apa pun yang bahkan jauh sesuai dengan skrip ECMA. Ini adalah praktik yang baik untuk menggunakan yang terakhir untuk menghindari variabel lokal tanpa sengaja membayangi objek konsol global, tetapi itu sama sekali tidak ada hubungannya dengan pilihan browser. console.log berfungsi dengan baik di IE8, dan AFAIK tidak ada kemampuan logging sama sekali di IE6 / 7.
Tgr