IE9 รองรับ console.log หรือไม่และเป็นฟังก์ชั่นจริงหรือไม่?


209

window.console.logInternet Explorer 9 กำหนดไว้ในสถานการณ์ใด?

แม้เมื่อwindow.console.logมีการกำหนดwindow.console.log.applyและwindow.console.log.callไม่ได้กำหนด ทำไมนี้

[คำถามที่เกี่ยวข้องกับ IE8: เกิดอะไรขึ้นกับ console.log ใน IE8 .]


3
ลองดูโพสต์ที่ยอดเยี่ยมเกี่ยวกับความซับซ้อนของวัตถุ / ฟังก์ชั่นคอนโซลIE8-9
Marc Climent


@ MarcCliment การเชื่อมโยงตาย
chakeda

@chakeda ฉันเกลียดเมื่อสิ่งนี้เกิดขึ้นมีลิงก์จากเว็บเก็บถาวร: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

คำตอบ:


299

ใน Internet Explorer 9 (และ 8) consoleวัตถุนั้นจะปรากฏเฉพาะเมื่อเปิดเครื่องมือสำหรับนักพัฒนาสำหรับแท็บเฉพาะ หากคุณซ่อนหน้าต่างเครื่องมือสำหรับนักพัฒนาสำหรับแท็บนั้นconsoleวัตถุจะยังคงปรากฏสำหรับแต่ละหน้าที่คุณนำทาง หากคุณเปิดแท็บใหม่คุณต้องเปิดเครื่องมือสำหรับนักพัฒนาสำหรับแท็บนั้นเพื่อให้consoleวัตถุปรากฏ

consoleวัตถุไม่ได้เป็นส่วนหนึ่งของมาตรฐานใด ๆ และเป็นส่วนขยายไปรูปแบบวัตถุเอกสาร เช่นเดียวกับวัตถุ DOM อื่น ๆ มันถูกพิจารณาว่าเป็นวัตถุโฮสต์และไม่จำเป็นต้องสืบทอดObjectหรือวิธีการใดFunctionๆ เช่นฟังก์ชัน ECMAScript ดั้งเดิมและวัตถุทำ นี่คือเหตุผลapplyและcallไม่ได้กำหนดไว้ในวิธีการเหล่านั้น ใน IE 9 วัตถุ DOM ส่วนใหญ่ได้รับการปรับปรุงเพื่อสืบทอดจากชนิด ECMAScript ดั้งเดิม เนื่องจากเครื่องมือของนักพัฒนาซอฟต์แวร์ถือเป็นส่วนเสริมสำหรับ IE (แม้ว่าจะเป็นส่วนเสริมในตัว) พวกเขาจึงไม่ได้รับการปรับปรุงเหมือนกับ DOM ที่เหลือ

สำหรับสิ่งที่คุ้มค่าคุณยังคงสามารถใช้Function.prototypeวิธีการบางอย่างกับconsoleวิธีการด้วยbind()เวทมนตร์เล็กน้อย:

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

2
เช่นเดียวกับconsoleวัตถุของ Firebug
Marcel Korpel

150
ฉันไม่สามารถพูดได้อย่างภาคภูมิใจว่าเป็นเวลาหลายปีที่ฉันพัฒนาขึ้นมาสำหรับเว็บฉันคิดว่า console.log ได้รับการสนับสนุนโดยเบราว์เซอร์ที่สำคัญทั้งหมด ฉันใช้เวลาทั้งวันในการหาสาเหตุว่าทำไม IE9 จึงไม่ชอบสคริปต์ของฉันและตอนนี้ฉันรู้แล้วว่าทำไม - มันมี console.log ในขั้นตอนแรก เป็นไปไม่ได้ที่จะทำการดีบักเนื่องจากการเปลี่ยนโหมดการดีบักทำให้จุดบกพร่องนี้หายไปในทันที: P ขอบคุณสำหรับการชี้แจง !!
f055

2
มีปัญหาเดียวกันเมื่อวานนี้ การติดตั้งDebugBarเกิดขึ้นเพื่อช่วยฉันเร็วขึ้นเนื่องจากไม่ได้กำหนดวัตถุคอนโซล ดังนั้นเมื่อฉันซ่อนคอนโซล IE แต่ไม่ใช่ DebugBar ฉันได้รับข้อความจากหลังว่ามีข้อผิดพลาด JavaScript (ไม่ได้กำหนดคอนโซล)
Simon A. Eugster

คุณควรตรวจสอบบันทึกข้อผิดพลาดในครั้งแรกที่ปัญหามาถึงคุณบน IE @ f055
Lucky Ali

7
ตัวเลือกอินเทอร์เน็ต -> ขั้นสูง -> แสดงการแจ้งเตือนเกี่ยวกับข้อผิดพลาดทุกสคริปต์ นักพัฒนาเว็บควรปล่อยให้เช็คอินใน IE อยู่เสมอ สิ่งนี้จะแจ้งให้คุณทราบเกี่ยวกับคอนโซลหรือฟังก์ชั่นบันทึกที่ไม่ได้กำหนด ... ไม่สามารถจดจำข้อความได้อย่างแม่นยำ
เซทดอกไม้

166

ทางออกที่ง่ายสำหรับปัญหา console.log นี้คือการกำหนดสิ่งต่อไปนี้ที่จุดเริ่มต้นของรหัส JS ของคุณ:

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

สิ่งนี้ใช้ได้สำหรับฉันในเบราว์เซอร์ทั้งหมด สิ่งนี้จะสร้างฟังก์ชันดัมมีสำหรับ console.log เมื่อดีบักเกอร์ไม่ทำงาน เมื่อดีบักเกอร์แอ็คทีฟเมธอด console.log จะถูกกำหนดและดำเนินการตามปกติ


8
ข้อมูลเพิ่มเติมและการแทนที่คอนโซลที่มีประสิทธิภาพมากขึ้น (รวมถึงวิธีการคอนโซลอื่น ๆ ) ที่นี่: stackoverflow.com/questions/8002116/…
Zach Lysobey

@ZachL: อันไหนในคอนกรีตอย่างแม่นยำ?
hakre

คำตอบของฉันมีวิธีที่หนึ่ง: stackoverflow.com/a/15771110/363701 ตรวจสอบสิ่งนี้ด้วย: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey

13

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่รู้สึกว่านี่เป็นการเพิ่มทางเลือกที่มีค่าของวิธีจัดการกับปัญหาคอนโซล วางรหัสต่อไปนี้ก่อนการเรียกเพื่อคอนโซล * (ดังนั้นสคริปต์แรกของคุณ)

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

การอ้างอิง:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js


10

console.log ถูกกำหนดเมื่อเปิดคอนโซลเท่านั้น หากคุณต้องการตรวจสอบมันในรหัสของคุณให้แน่ใจว่าคุณตรวจสอบได้ในคุณสมบัติหน้าต่าง

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

นี่จะทำให้เกิดข้อยกเว้นใน IE9 และจะทำงานไม่ถูกต้อง อย่าทำอย่างนี้

if (console) 
    console.log(msg)

6

หลังจากอ่านบทความจากความคิดเห็นของ Marc Cliament ข้างบนตอนนี้ฉันได้เปลี่ยนฟังก์ชั่น cross-browser console.log อเนกประสงค์ของฉันเป็นดังนี้:

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
เพียงFunction.prototype.apply.call(console.log, console, arguments);
Victor

@Victor แน่นอนมันควรจะเป็นคำตอบเดียวเท่านั้นที่ยอมรับ!
Pavel Frankov

0

ฉันอยากจะพูดถึงว่า IE9 ไม่เพิ่มข้อผิดพลาดถ้าคุณใช้ console.log ด้วยเครื่องมือของนักพัฒนาซอฟต์แวร์ที่ปิดใน Windows ทุกรุ่น ใน XP ใช้งานได้ แต่บน Windows 7 ไม่เป็นเช่นนั้น ดังนั้นหากคุณไม่สนับสนุน WinXP โดยทั่วไปคุณก็สามารถใช้ console.log ได้โดยตรง


-1

เกี่ยวกับ...

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

1
นี่อาจเป็นวิธีแก้ปัญหาที่ผ่านได้ในบางกรณี แต่คุณยังไม่ได้ตอบคำถาม
pswg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.