'console' เป็นข้อผิดพลาดที่ไม่ได้กำหนดสำหรับ Internet Explorer


375

ฉันใช้ Firebug และมีข้อความบางอย่างเช่น:

console.log("...");

ในหน้าของฉัน ใน IE8 (อาจเป็นเวอร์ชั่นก่อนหน้านี้ด้วย) ฉันพบข้อผิดพลาดของสคริปต์ว่า 'คอนโซล' ไม่ได้กำหนดไว้ ฉันลองวางที่ด้านบนของหน้า:

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

ยังฉันได้รับข้อผิดพลาด มีวิธีใดที่จะกำจัดข้อผิดพลาด?


4
ใช้typeofในของคุณถ้ามันจะหลีกเลี่ยงข้อผิดพลาดที่ไม่ได้กำหนด: if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Flak DiNenno

21
console.log () ใช้งานได้เฉพาะเมื่อเครื่องมือ dev ของ IE เปิดอยู่ (ใช่ IE คือเส็งเคร็ง) ดูstackoverflow.com/questions/7742781/…
Adrien Be

1
คำตอบที่ดีที่สุดสำหรับคำถามนั้นคือstackoverflow.com/a/16916941/2274855
Vinícius Moraes


1
@Aprillion ลิงก์เสียให้ใช้สิ่งนี้แทน: github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Alfred Bez

คำตอบ:


378

ลอง

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

ตัวแปรที่ไม่ได้กำหนดไม่สามารถอ้างอิงได้โดยตรง อย่างไรก็ตามตัวแปรโกลบอลทั้งหมดเป็นแอ็ตทริบิวต์ที่มีชื่อเดียวกันกับบริบทโกลบอล ( windowในกรณีของเบราว์เซอร์) และการเข้าถึงแอ็ตทริบิวต์ที่ไม่ได้กำหนดนั้นใช้ได้

หรือการใช้งานif (typeof console === 'undefined') console = ...ถ้าคุณต้องการที่จะหลีกเลี่ยงตัวแปรมายากลwindowให้ดูคำตอบ @ Tim ลงของ


160
เพื่อให้ชัดเจนกับคนอื่นที่ใช้สิ่งนี้<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>อยู่ที่ด้านบนของหน้าของคุณ! ขอบคุณเคนนี
windowsgm

11
แล้วvar console = console || { log: function() {} };
devlord

9
@lorddev ในการใช้ชวเลขนั้นคุณต้องรวมwindow:var console = window.console || { log: function() {} };
jlengstorf

64
ประณาม ... คุณสร้างเว็บไซต์ที่ดีพัฒนาสำหรับเบราว์เซอร์ที่คุณชื่นชอบ ในตอนท้ายคุณใช้เวลา 4-5 ชั่วโมงทำให้มันเข้ากันได้กับเบราว์เซอร์ MODERN อื่น ๆ ทั้งหมดและจากนั้นคุณใช้เวลา 4-5 วันเพื่อให้เข้ากันได้กับ IE
อิสราเอล

6
ปัญหาของคำตอบนั้นคือถ้าคุณใช้ชื่ออื่นเช่นดีบั๊ก, เตือน, นับด้วยเบราว์เซอร์ที่ไม่มีคอนโซลจะทำให้เกิดข้อยกเว้นดูวิธีที่ดีกว่าในการทำstackoverflow.com/a/16916941/2274855
Vinícius Moraes

319

วางต่อไปนี้ที่ด้านบนของ JavaScript ของคุณ (ก่อนที่จะใช้คอนโซล):

/**
 * 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 ฟังก์ชั่นการปิดคือการกำหนดขอบเขตตัวแปรที่จะไม่กำหนดตัวแปรใด ๆ ยามนี้ต่อต้านทั้งไม่ได้กำหนดconsoleและไม่ได้กำหนดconsole.debug(และวิธีการที่ขาดหายไปอื่น ๆ )

แก้ไข:ฉันสังเกตเห็นว่าHTML5 Boilerplateใช้รหัสที่คล้ายกันในไฟล์ js / plugins.js หากคุณกำลังมองหาวิธีแก้ปัญหาที่ (อาจจะ) ได้รับการปรับปรุงให้ทันสมัย


14
ทำไมคำตอบนี้มีผู้อัปโหลดน้อยมาก เป็นหนึ่งในรายการที่สมบูรณ์ที่สุดที่โพสต์ที่นี่
mavilein

เพราะวันที่ เห็นด้วยอย่างแน่นอนกับโซลูชั่นการทำงานที่ถูกต้อง ฉันคิดว่าหัวข้อนี้ต้องมีการกลั่นกรอง ขออภัยสำหรับภาษาอังกฤษที่ไม่ดี
woto

ค่อนข้างสมบูรณ์ยกเว้นว่าจะไม่พยายามเปลี่ยนเส้นทางการบันทึกไปยังฟังก์ชันบันทึก (ถ้ามี) ดังนั้นการบันทึกทั้งหมดจะสูญหาย
Christophe Roussy

5
สิ่งนี้จะเกิดขึ้นเมื่อใด รหัสนี้ควรกำหนดองค์ประกอบที่ยังไม่ได้กำหนดเท่านั้น
Peter Tseng

4
ฉันคิดว่าอย่างใด - (function () {... } ()) หรือ (function () {... }) () - ใช้งานได้จริง
Peter Tseng

73

อีกทางเลือกหนึ่งคือtypeofโอเปอเรเตอร์:

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

แต่อีกทางเลือกหนึ่งคือการใช้ห้องสมุดการเข้าสู่ระบบเช่นของตัวเองlog4javascript


เป็นความคิดที่ดีที่จะเปลี่ยนการมอบหมายที่ไม่ได้ประกาศไว้เป็นการประกาศที่เหมาะสม
kangax

1
คุณหมายถึงการใช้var? นั่นจะทำให้สับสนเท่านั้น หรือคุณหมายถึงการมอบหมายให้window.consoleมากกว่าconsole?
Tim Down

varการใช้ ทำไมมันจะสับสนสิ่งต่าง ๆ ที่นี่?
kangax

2
เป็นการสนทนาที่สับสน +1 ถึงคำตอบเดิม ถ้าฉันสามารถให้ +2 ฉันจะให้ลิงค์กับคุณ log4javascript ขอบคุณ OP!
Jay Taylor

8
@yckart: ไม่typeofรับประกันว่าจะส่งคืนสตริงและ"undefined"เป็นสตริง เมื่อตัวถูกดำเนินการทั้งสองเป็นประเภทเดียวกัน==และ===ถูกระบุให้ทำตามขั้นตอนเดียวกันทั้งหมด การใช้typeof x == "undefined"เป็นวิธีที่มั่นคงในการทดสอบxว่าไม่ได้กำหนดไว้ในขอบเขตใด ๆ และสภาพแวดล้อมที่สอดคล้องกับ ECMAScript 3
Tim Down

47

สำหรับโซลูชันที่มีประสิทธิภาพยิ่งขึ้นให้ใช้โค้ดนี้ (นำมาจากซอร์สโค้ดของ 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;
        }
    }
}());

13

ในสคริปต์ของฉันฉันใช้ชวเลข:

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

หรือถ้ามันเป็นไปไม่ได้หรือเป็นไปได้ที่จะแก้ไขทุกบรรทัด console.log ฉันสร้างคอนโซลปลอม:

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

2
ข้อผิดพลาดทางไวยากรณ์ ทำไมต้องไม่ใช่if(!console) {console = {} ; console.log = function(){};}
Meekohi

1
หรือไม่เพียงแค่!window.console && (window.console = { log: function () { } });
Maksim Vi

10

คุณสามารถใช้console.log()หากคุณมีDeveloper Toolsใน IE8 เปิดและคุณสามารถใช้Consoleกล่องข้อความในแท็บสคริปต์


7
สิ่งนี้ไม่ดีถ้าคุณลืมสลับรหัสของคอนโซล ข้อผิดพลาดใน IE8 จะป้องกันไม่ให้รหัส JS ของคุณจากการทำงาน
yunzen

7
if (typeof console == "undefined") {
  this.console = {
    log: function() {},
    info: function() {},
    error: function() {},
    warn: function() {}
  };
}

1
ข้อแม้ emptor: นี้ควรจะกำหนดไว้ในระดับโลกที่หมายถึงthis window
Sgnl

7

อ้างอิงจากคำตอบก่อนหน้าสองคำโดย

และเอกสารประกอบสำหรับ

นี่คือการใช้ความพยายามอย่างดีที่สุดสำหรับปัญหาซึ่งหมายความว่าหากมี console.log ซึ่งมีอยู่จริงจะเติมช่องว่างสำหรับวิธีที่ไม่มีอยู่ผ่านทาง console.log

ตัวอย่างเช่นสำหรับ IE6 / 7 คุณสามารถแทนที่การบันทึกด้วยการแจ้งเตือน (โง่ แต่ใช้งานได้) แล้วรวมมอนสเตอร์ด้านล่าง (ฉันเรียกมันว่า console.js): [อย่าลังเลที่จะลบความคิดเห็นตามที่เห็นสมควรฉันทิ้งไว้ในการอ้างอิง เครื่องมือขนาดเล็กสามารถแก้ไขปัญหาได้]:

<!--[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>

และ 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];
            }
        }
    })();

ฉันไม่แน่ใจว่าเราต้องการmethods.hasOwnProperty(method) && วงวนหรือไม่
TWiStErRob

ฉันแน่ใจว่าคุณต้องการมัน
ErikE

ได้ทดสอบอย่างรวดเร็วในคอนโซลของ Chrome: > x = { a: 1, b: 2}-> Object {a: 1, b: 2}และ->for(var f in x) {console.log(f + " " + x[f]);} 'end' a 1 b 2 "end"ดังนั้นวัตถุที่ไม่ระบุชื่อที่ถูกสร้างขึ้นจึงไม่มีคุณสมบัติเพิ่มเติมใด ๆ และmethodsถูกสร้างขึ้นก่อนforลูป เป็นไปได้ที่จะแฮ็คข้างต้นหรือไม่
TWiStErRob

3
ใช่. var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}คุณไม่มีทางรู้ว่าห้องสมุดได้ทำอะไรกับวัตถุในห่วงโซ่การสืบทอดของวัตถุที่คุณกำลังทำงานด้วย ดังนั้นคำแนะนำโดยเครื่องมือที่มีคุณภาพรหัสจาวาสคริปต์เช่น jshint และ JSLint hasOwnPropertyกับการใช้
ErikE

6

ใน IE9 หากไม่ได้เปิดคอนโซลรหัสนี้:

alert(typeof console);

จะแสดง "วัตถุ" แต่รหัสนี้

alert(typeof console.log);

จะโยนข้อยกเว้น TypeError แต่จะไม่ส่งคืนค่าที่ไม่ได้กำหนด

ดังนั้นรหัสรุ่นที่รับประกันจะมีลักษณะคล้ายกับสิ่งนี้:

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

6

ฉันใช้ console.log ในรหัสของฉันเท่านั้น ดังนั้นฉันจึงรวม 2 ซับที่สั้นมาก

var console = console || {};
console.log = console.log || function(){};

1
วิธีการทำงาน .. ฉันไม่เห็นบรรทัด console.log ใด ๆ ที่พิมพ์ไปยังเบราว์เซอร์ IE ฉันได้ทดสอบกับ 2 ระบบที่แตกต่างกันซึ่งใน 1 - console.log ทำงานและ 2 ระบบไม่ ฉันลองทั้งสองอย่างแล้ว แต่ไม่เห็นบันทึกใด ๆ ทั้งสองระบบ
kiran

2

สังเกตเห็นว่า OP ใช้ Firebug กับ IE จึงถือว่าเป็นของFirebug Lite นี่เป็นสถานการณ์ที่ขี้ขลาดเมื่อคอนโซลได้รับการกำหนดใน IE เมื่อหน้าต่างดีบักเกอร์เปิดขึ้น แต่จะเกิดอะไรขึ้นเมื่อ Firebug ทำงานอยู่แล้ว ไม่แน่ใจ แต่อาจเป็นวิธี "firebugx.js" อาจเป็นวิธีที่ดีในการทดสอบในสถานการณ์นี้:

แหล่งที่มา:

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

(ลิงก์ที่อัปเดต 12/2014)



1

สำหรับการดีบักใน IE ให้ตรวจสอบlog4javascriptนี้


มันยอดเยี่ยมมากโดยเฉพาะอย่างยิ่งเมื่อคอนโซล IE8 ของฉันไม่แสดงผลอะไร
Firsh - LetsWP.io

1
@Firsh ขอบคุณสำหรับความคิดเห็นของคุณ
Praveen

1
ฉันกำลังมองหาความคิดเห็นเกี่ยวกับคำถามอื่นที่นี่ที่กล่าวว่า 'การส่งเสริมตนเองที่ไร้ยางอาย' หรือฉันไม่รู้ - คล้ายกัน - มีคนที่บอกว่าเขาสร้างเรื่องนี้ขึ้นมาใช่ไหม? ฉันปิดแท็บนั้นไปแล้ว อย่างไรก็ตามมันเป็นเครื่องมือที่ยอดเยี่ยมและมีประโยชน์มากสำหรับโครงการของฉัน
Firsh - LetsWP.io

1
@Firsh ฉันไม่ได้สร้างสคริปต์นี้ฉันเป็นคนที่คุณได้รับประโยชน์จากการใช้เครื่องมือ
Praveen

1

สำหรับการสนับสนุน IE8 หรือคอนโซล จำกัด อยู่ที่ console.log (ไม่มีการดีบัก, ติดตาม, ... ) คุณสามารถทำสิ่งต่อไปนี้:

  • ถ้า console OR console.log ไม่ได้กำหนด: สร้างฟังก์ชันดัมมี่สำหรับฟังก์ชั่นคอนโซล (trace, debug, log, ... )

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

  • มิเช่นนั้นจะมีการกำหนด console.log (IE8) AND console.debug (อื่น ๆ ) ไม่ได้ถูกกำหนดไว้: เปลี่ยนเส้นทางฟังก์ชั่นการบันทึกทั้งหมดไปยัง console.log ซึ่งจะช่วยให้สามารถเก็บบันทึกเหล่านั้นได้!

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

ไม่แน่ใจเกี่ยวกับการสนับสนุนการยืนยันใน IE เวอร์ชันต่าง ๆ แต่ยินดีต้อนรับคำแนะนำใด ๆ โพสต์คำตอบนี้ด้วยที่นี่: ฉันจะใช้การบันทึกคอนโซลใน Internet Explorer ได้อย่างไร



1

ส่วนของคอนโซลใน 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: () => { },
    }
};

0

คุณสามารถใช้ด้านล่างเพื่อให้การประกันระดับพิเศษที่คุณมีฐานครอบคลุมทั้งหมด การใช้typeofก่อนจะหลีกเลี่ยงundefinedข้อผิดพลาดใด ๆ การใช้===จะทำให้แน่ใจว่าชื่อของชนิดนั้นเป็นจริงสตริง "undefined" ในที่สุดคุณจะต้องเพิ่มพารามิเตอร์ลงในฟังก์ชั่นลายเซ็น (ฉันเลือกlogMsgโดยพล) เพื่อให้แน่ใจว่าสอดคล้องเนื่องจากคุณผ่านสิ่งที่คุณต้องการพิมพ์ไปยังคอนโซลไปยังฟังก์ชั่นบันทึก สิ่งนี้ยังช่วยให้คุณมีความถูกต้องแม่นยำและหลีกเลี่ยงคำเตือน / ข้อผิดพลาดใน JS aware IDE ของคุณ

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

0

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


0

พบปัญหาที่คล้ายกันในการใช้งาน console.log ในหน้าต่างลูกใน IE9 สร้างขึ้นโดยฟังก์ชั่น window.open

ดูเหมือนว่าในกรณีนี้คอนโซลจะถูกกำหนดในหน้าต่างหลักเท่านั้นและไม่ได้กำหนดไว้ในหน้าต่างลูกจนกว่าคุณจะรีเฟรช เช่นเดียวกับเด็ก ๆ ของ windows เด็ก

ฉันจัดการกับปัญหานี้โดยการตัดการบันทึกในฟังก์ชั่นถัดไป (ด้านล่างเป็นส่วนของโมดูล)

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

-2

หลังจากมีปัญหามากมายกับสิ่งนี้ (มันยากที่จะแก้ไขข้อผิดพลาดเนื่องจากถ้าคุณเปิดคอนโซลนักพัฒนาซอฟต์แวร์จะไม่เกิดข้อผิดพลาดอีกต่อไป!) ฉันตัดสินใจที่จะสร้างรหัส overkill เพื่อไม่ต้องมายุ่งกับเรื่องนี้อีกเลย:

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

Personaly ฉันเคยใช้ console.log และ console.error เท่านั้น แต่รหัสนี้จะจัดการกับฟังก์ชั่นอื่น ๆ ทั้งหมดดังที่แสดงในเครือข่ายนักพัฒนาของ Mozzila: https://developer.mozilla.org/en-US/docs/Web/API/console . เพียงแค่วางโค้ดนั้นไว้ที่ด้านบนของหน้าและคุณจะทำอย่างนี้ตลอดไป


-11

คุณสามารถใช้ console.log (... ) โดยตรงใน Firefox แต่ไม่ใช่ใน IEs ใน IEs คุณต้องใช้ window.console


11
console.log และ window.console.log อ้างถึงฟังก์ชั่นเดียวกันในเบราว์เซอร์ที่สอดคล้องกับ ECMAscript จากระยะไกล เป็นวิธีปฏิบัติที่ดีในการใช้หลังเพื่อหลีกเลี่ยงตัวแปรท้องถิ่นที่ทำเงาวัตถุคอนโซลทั่วโลกโดยไม่ได้ตั้งใจ แต่มันไม่มีอะไรเกี่ยวข้องกับตัวเลือกเบราว์เซอร์ console.log ทำงานได้ดีใน IE8 และ AFAIK ไม่มีความสามารถในการบันทึกข้อมูลทั้งหมดใน IE6 / 7
Tgr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.