javascript - इंटरनेट एक्सप्लोरर के लिए 'कंसोल' अपरिभाषित त्रुटि है




internet-explorer internet-explorer-8 (14)

IE8 या कंसोल समर्थन के लिए console.log तक सीमित नहीं है (कोई डीबग, ट्रेस, ...) आप निम्न कार्य कर सकते हैं:

  • यदि कंसोल या console.log अपरिभाषित है: कंसोल फ़ंक्शन के लिए डमी फ़ंक्शन बनाएं (ट्रेस, डीबग, लॉग, ...)

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

  • अन्यथा अगर console.log परिभाषित किया गया है (IE8) और console.debug (कोई अन्य) परिभाषित नहीं किया गया है: सभी लॉगिंग फ़ंक्शंस को console.log पर रीडायरेक्ट करें, यह उन लॉग को रखने की अनुमति देता है!

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

विभिन्न आईई संस्करणों में जोर समर्थन के बारे में निश्चित नहीं है, लेकिन किसी भी सुझाव का स्वागत है। इस उत्तर को यहां भी पोस्ट किया गया: मैं इंटरनेट एक्सप्लोरर में कंसोल लॉगिंग का उपयोग कैसे कर सकता हूं?

मैं फायरबग का उपयोग कर रहा हूं और कुछ बयान जैसे हैं:

console.log("...");

मेरे पेज में आईई 8 (शायद पहले के संस्करण भी) में मुझे स्क्रिप्ट त्रुटियां मिलती हैं कि 'कंसोल' अपरिभाषित है। मैंने इसे अपने पेज के शीर्ष पर डालने की कोशिश की:

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

अभी भी मुझे त्रुटियां मिलती हैं। त्रुटियों से छुटकारा पाने के लिए कोई रास्ता?


IE9 में बाल विंडो में console.open फ़ंक्शन द्वारा बनाई गई कंसोल.लॉग चलाने वाली समान समस्या उत्पन्न हुई।

ऐसा लगता है कि इस मामले में कंसोल केवल मूल विंडो में परिभाषित किया जाता है और जब तक आप उन्हें रीफ्रेश नहीं करते हैं तब तक बाल विंडो में अपरिभाषित होता है। बाल खिड़कियों के बच्चों पर भी लागू होता है।

मैं अगले कार्य में लॉग लपेटकर इस मुद्दे से निपटता हूं (नीचे मॉड्यूल का खंड है)

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

अधिक मजबूत समाधान के लिए, कोड के इस टुकड़े का उपयोग करें (ट्विटर के स्रोत कोड से लिया गया):

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

अपनी जावास्क्रिप्ट के शीर्ष पर निम्नलिखित पेस्ट करें (कंसोल का उपयोग करने से पहले):

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

फ़ंक्शन क्लोजर रैपर वेरिएबल्स को दायरा देना है क्योंकि किसी भी चर को परिभाषित नहीं किया जाता है। यह गार्ड दोनों अपरिभाषित console और अपरिभाषित console.debug (और अन्य अनुपलब्ध विधियों) के खिलाफ है।

संपादित करें: मैंने देखा है कि एचटीएमएल 5 बॉयलरप्लेट अपने जेएस / प्लगइन्स.जेएस फ़ाइल में समान कोड का उपयोग करता है, अगर आप ऐसे समाधान की तलाश में हैं जो (संभवतः) अद्यतित रखा जाएगा।


आप बीमा का एक अतिरिक्त डिग्री देने के लिए नीचे दिए गए उपयोग कर सकते हैं कि आपके पास सभी आधार शामिल हैं। typeof का उपयोग पहले किसी भी undefined त्रुटियों से बच जाएगा। === का उपयोग करके यह भी सुनिश्चित होगा कि प्रकार का नाम वास्तव में स्ट्रिंग "अपरिभाषित" है। अंत में, आप स्थिरता सुनिश्चित करने के लिए फ़ंक्शन हस्ताक्षर (मैंने मनमाने ढंग से logMsg चुना है) में एक पैरामीटर जोड़ना चाहते हैं, क्योंकि आप लॉग फ़ंक्शन में कंसोल पर जो कुछ भी प्रिंट करना चाहते हैं उसे पास करते हैं। यह आपको इंटेलिजेंस सटीक भी रखता है और आपके जेएस जागरूक आईडीई में किसी भी चेतावनी / त्रुटियों से बचाता है।

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

आप सीधे console में console.log (...) का उपयोग कर सकते हैं लेकिन आईई में नहीं। आईईएस में आपको window.console का उपयोग करना होगा।


एक और विकल्प typeof ऑपरेटर है:

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

फिर भी एक और विकल्प लॉगिंग लाइब्रेरी का उपयोग करना है, जैसे कि मेरी खुद की log4javascript


कभी-कभी कंसोल IE8 / 9 में काम करेगा लेकिन दूसरी बार विफल हो जाएगा। यह अनियमित व्यवहार इस बात पर निर्भर करता है कि क्या आपके पास डेवलपर टूल्स खुले हैं और स्टैक ओवरफ्लो प्रश्न में वर्णित है क्या IE9 console.log का समर्थन करता है, और क्या यह वास्तविक कार्य है?


दो पिछले उत्तरों के आधार पर

  • Vinícius मोरास
  • पीटर Tseng

और के लिए दस्तावेज

इस मुद्दे के लिए यहां एक सर्वोत्तम प्रयास कार्यान्वयन है, जिसका अर्थ है कि यदि कोई कंसोल.लॉग वास्तव में मौजूद है, तो यह console.log के माध्यम से गैर-मौजूदा तरीकों के अंतराल में भर जाता है।

उदाहरण के लिए आईई 6/7 के लिए आप लॉगिंग को अलर्ट (बेवकूफ लेकिन काम करता है) के साथ बदल सकते हैं और फिर नीचे राक्षस (मैंने इसे console.js कहा है) शामिल करें: [जब आप फिट देखते हैं तो टिप्पणियों को हटाने के लिए स्वतंत्र महसूस करें, मैंने उन्हें संदर्भ के लिए छोड़ दिया, एक minimizer उन्हें निपट सकते हैं]:

<!--[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];
            }
        }
    })();

नोट किया गया कि ओपी आईई के साथ फायरबग का उपयोग कर रहा है, तो मान लें कि यह फायरबग लाइट है । यह एक भयानक स्थिति है क्योंकि डीएसयूगर विंडो खोले जाने पर कंसोल को IE में परिभाषित किया जाता है, लेकिन फ़ायरबग पहले से चल रहा है तो क्या होता है? निश्चित नहीं है, लेकिन शायद इस स्थिति में परीक्षण करने के लिए "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)


मेरी लिपियों में, मैं या तो शॉर्टेंड का उपयोग करता हूं:

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

मैं fauxconsole का उपयोग कर रहा हूँ; मैंने सीएसएस को थोड़ा सा संशोधित किया ताकि यह अच्छा लगे लेकिन बहुत अच्छी तरह से काम करता है।


यदि आप IE8 में Developer Tools खोले हैं तो आप console.log() उपयोग कर सकते हैं और आप स्क्रिप्ट टैब पर Console टेक्स्टबॉक्स का भी उपयोग कर सकते हैं।


console = console || { 
    debug: function(){}, 
    log: function(){}
    ...
}




ie-developer-tools