IE8 में कंसोल.लॉग का क्या हुआ?


254

इस पोस्ट के अनुसार यह बीटा में था, लेकिन यह रिलीज में नहीं है?


65
console.log है IE8 में वहाँ है, लेकिन consoleवस्तु जब तक आप खुले DevTools नहीं बनाया गया है। इसलिए, एक कॉल console.logमें त्रुटि हो सकती है, उदाहरण के लिए यदि यह पृष्ठ लोड पर होता है इससे पहले कि आपके पास देव उपकरण खोलने का मौका हो। यहां जीतने वाला जवाब इसे और अधिक विस्तार से बताता है।
SDC

जवाबों:


229

कमबैक के लिए यह बेहतर है:


   var alertFallback = true;
   if (typeof console === "undefined" || typeof console.log === "undefined") {
     console = {};
     if (alertFallback) {
         console.log = function(msg) {
              alert(msg);
         };
     } else {
         console.log = function() {};
     }
   }


71
यह इतना अव्यावहारिक है - आप संभवतः किसी वेबसाइट को किसी ऐसी चीज़ के साथ कैसे डिबग कर सकते हैं जो कंसोल के लिए हर कॉल के लिए अलर्ट फेंकता है। ()। यदि आपके पास कोड में लॉग () करने के लिए 10+ कॉल हैं तो क्या होगा। यदि संदेश एक वस्तु है तो क्या होगा? शुरुआती बिंदु के रूप में वाल्टर का जवाब ज्यादा मायने रखता है।
प्रीसैस्टिक

7
@Precastic: लोग ब्राउज़र का उपयोग करना बंद कर देंगे: P
अमोघ तलपल्लिकर

मिस्टर लकी के जवाब पर मेरी टिप्पणी देखें ।
डैनियल स्किलिंग

1
एक विनीत (हालांकि अपूर्ण) वैकल्पिक वापसी के लिए document.title सेट करना है। कम से कम यह एक मोडल अलर्ट के साथ ब्राउज़र को लॉक नहीं करता है।
ब्रेननियॉन्ग

257

आपके द्वारा डेवलपर टूल (F12 को खोलने और बंद करने के लिए टॉगल करने के बाद) कंसोल केवल उपलब्ध है। मजेदार बात यह है कि इसे खोलने के बाद, आप इसे बंद कर सकते हैं, फिर भी इसे कंसोल.लॉग कॉल के माध्यम से पोस्ट कर सकते हैं, और जब आप इसे फिर से खोलेंगे तो वे दिखाई देंगे। मैं सोच रहा हूं कि यह एक प्रकार का बग है, और इसे ठीक किया जा सकता है, लेकिन हम देखेंगे।

मैं शायद कुछ इस तरह का उपयोग करूँगा:

function trace(s) {
  if ('console' in self && 'log' in console) console.log(s)
  // the line below you might want to comment out, so it dies silent
  // but nice for seeing when the console is available or not.
  else alert(s)
}

और भी सरल:

function trace(s) {
  try { console.log(s) } catch (e) { alert(s) }
}

11
किसी भी तरह से आपको कंसोल.लॉग को नेत्रहीन नहीं कहा जाना चाहिए क्योंकि $ अन्य-ब्राउज़र में यह नहीं हो सकता है और इस तरह जावास्क्रिप्ट त्रुटि के साथ मर सकता है। +1
केंट फ्रेड्रिक

8
आप शायद किसी भी तरह रिलीज होने से पहले निशान को बंद करना चाहते हैं;)
केंट फ्रेड्रिक

2
यह समझ में आता है कि डेवलपर टूल खुले बिना लॉग इन नहीं होता है, लेकिन अगर कोई चुपचाप विफल हो जाता है तो यह एक अपवाद है।
ehdv

4
मैं सांत्वना लपेटने के लिए एक नकारात्मक पक्ष को इंगित करना चाहता हूं। इस तरह से ... आप अब नहीं देखेंगे कि आपका लॉगिंग कहां से आ रहा है। मुझे लगता है कि बहुत उपयोगी है जो कभी-कभी शीर्ष पर होता है, जो आपके कोड में ठीक उसी स्थान से उत्पन्न होने वाली प्रत्येक कंसोल लाइन को गलत लगता है।
मार्टिन वेस्टिन

2
alertबुराई है। जब अलर्ट का उपयोग किया जाता है तो कुछ कोड अलग तरीके से व्यवहार करते हैं क्योंकि दस्तावेज़ फ़ोकस खो देता है, जिससे बग का निदान करना या उन्हें बनाना मुश्किल हो जाता है जहाँ पहले नहीं थे। इसके अलावा, यदि आप गलती console.logसे अपने उत्पादन कोड में छोड़ देते हैं , तो यह सौम्य है (यह मानते हुए कि यह उड़ा नहीं है) - बस चुपचाप कंसोल पर लॉग करता है। यदि आप गलती alertसे अपने उत्पादन कोड में छोड़ देते हैं , तो उपयोगकर्ता अनुभव बर्बाद हो जाता है।
डैनियल स्किलिंग

56

यह विभिन्न उत्तरों पर मेरी राय है। मैं वास्तव में लॉग किए गए संदेशों को देखना चाहता था, भले ही मुझे IE कंसोल खुला नहीं था जब उन्हें निकाल दिया गया था, इसलिए मैं उन्हें एक console.messagesसरणी में धक्का देता हूं जो मैं बनाता हूं। मैंने console.dump()पूरे लॉग को देखने की सुविधा के लिए एक फ़ंक्शन भी जोड़ा । console.clear()संदेश कतार को खाली कर देगा।

यह समाधान अन्य कंसोल विधियों को भी "हैंडल" करता है (जो मुझे लगता है कि सभी फायरबग कंसोल एपीआई से उत्पन्न हुए हैं )

अंत में, यह समाधान एक IIFE के रूप में है , इसलिए यह वैश्विक दायरे को प्रदूषित नहीं करता है। फ़ॉलबैक फ़ंक्शन तर्क कोड के निचले भाग में परिभाषित किया गया है।

मैं इसे अपने मास्टर जेएस फ़ाइल में छोड़ता हूं जो हर पृष्ठ पर शामिल है, और इसके बारे में भूल जाओ।

(function (fallback) {    

    fallback = fallback || function () { };

    // function to trap most of the console functions from the FireBug Console API. 
    var trap = function () {
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var message = args.join(' ');
        console.messages.push(message);
        fallback(message);
    };

    // redefine console
    if (typeof console === 'undefined') {
        console = {
            messages: [],
            raw: [],
            dump: function() { return console.messages.join('\n'); },
            log: trap,
            debug: trap,
            info: trap,
            warn: trap,
            error: trap,
            assert: trap,
            clear: function() { 
                  console.messages.length = 0; 
                  console.raw.length = 0 ;
            },
            dir: trap,
            dirxml: trap,
            trace: trap,
            group: trap,
            groupCollapsed: trap,
            groupEnd: trap,
            time: trap,
            timeEnd: trap,
            timeStamp: trap,
            profile: trap,
            profileEnd: trap,
            count: trap,
            exception: trap,
            table: trap
        };
    }

})(null); // to define a fallback function, replace null with the name of the function (ex: alert)

कुछ अतिरिक्त जानकारी

लाइन ऑब्जेक्ट var args = Array.prototype.slice.call(arguments);से एक ऐरे बनाती है arguments। यह आवश्यक है क्योंकि तर्क वास्तव में एक ऐरे नहीं है

trap()एपीआई कार्यों में से किसी के लिए एक डिफ़ॉल्ट हैंडलर है। मैं तर्कों को पास करता हूं messageताकि आपको उन तर्कों का एक लॉग मिले जो किसी भी एपीआई कॉल (बस नहीं console.log) में पारित किए गए थे ।

संपादित करें

मैंने एक अतिरिक्त सरणी जोड़ी जो console.rawतर्कों को ठीक उसी तरह से जोड़ देती है जैसा कि पारित किया गया है trap()। मैंने महसूस किया कि args.join(' ')वस्तुओं को स्ट्रिंग में परिवर्तित कर रहा था "[object Object]"जो कभी-कभी अवांछनीय हो सकता है। सुझाव के लिए धन्यवाद bfontaine


4
+1 यह एकमात्र समाधान है जो समझ में आने लगता है। आप किस दुनिया में उन संदेशों को देखना नहीं चाहेंगे जिन्हें आप स्पष्ट रूप से कंसोल पर भेज रहे हैं!
प्रीकैस्टिक

बहुत बढ़िया जवाब। वास्तव में आपके द्वारा उल्लेखित IIFE लेख पसंद आया, शायद मैंने अब तक पढ़ा सबसे अच्छा में से एक है। क्या आप कृपया विस्तार से बता सकते हैं कि इन दो पंक्तियों के trapकार्य का उद्देश्य क्या है var args = Array.prototype.slice.call(arguments); var message = args.join(' ');:? आप इस संदेश के माध्यम से तर्क क्यों पारित करते हैं?
user1555863

1
@ user1555863 मैंने आपके प्रश्नों का उत्तर देने के लिए अपना उत्तर अपडेट कर दिया है, कोड के नीचे का अनुभाग देखें।
वाल्टर स्टेबोस

1
मुझे लगता है कि आपके "कंसोल.क्लेयर ()" फ़ंक्शन की दूसरी पंक्ति को "कंसोल.ब्रॉन्ग = 0" के बजाय "कंसोल.क्रो.लिफ्ट = 0" पढ़ना चाहिए।
स्टीव जे।

52

यह ध्यान देने योग्य है कि console.logIE8 में एक सही जावास्क्रिप्ट फ़ंक्शन नहीं है। यह applyया callविधियों का समर्थन नहीं करता है ।


3
+1 यह आज सुबह की मेरी सटीक त्रुटि है। मैं कंसोल पर तर्क लागू करने की कोशिश कर रहा हूं। I और IE8 मुझसे नफरत कर रहा है।
बर्नहार्ड हॉफमैन

[मजाक] माइक्रोसॉफ्ट का कहना है "यह हमारे लिए असुरक्षित है कि हम लोगों को कंसोल ऑब्जेक्ट को अधिलेखित करने दें": /
टॉम रोजगेरो

1
मैं उपयोग कर रहा हूँ: console.log=Function.prototype.bind.call(console.log,console);इस के आसपास पाने के लिए।
मोवल्कर

1
IE8 नहीं है bind
कट्सपॉ जूल

44

यह मानते हुए कि आप अलर्ट के प्रति कमबैक की परवाह नहीं करते हैं, यहां इंटरनेट एक्सप्लोरर की कमियों को हल करने का एक और अधिक संक्षिप्त तरीका है:

var console=console||{"log":function(){}};

+1 चूंकि मैं एक अनाम फ़ंक्शन में अपने कोड को बाहर कर रहा हूं, इसलिए एक चर में कंसोल को इस तरह से रखना मेरे लिए सबसे अच्छा समाधान है। अन्य पुस्तकालयों में चल रहे किसी भी अन्य कंसोल हुकिंग में हस्तक्षेप न करने में मेरी मदद करता है।
कोडस्लेथ

2
जैसे ही डेवलपर टूल खुल गए हैं आप लॉगिंग शुरू करना चाहते हैं। यदि आप इस समाधान को एक लंबे समय के दायरे में रखते हैं (जैसे कॉलबैक के रूप में आंतरिक कार्यों को पंजीकृत करता है), तो यह साइलेंट फ़ॉलबैक का उपयोग करता रहेगा।
बेनी चेरनियाव्स्की-पास्किन

+ 1 / -1 = 0: +1 क्योंकि कंसोल को रोकने के लिए समाधान अधिक आधारित होना चाहिए। IE में किसी साइट को तोड़ने से रोकने के लिए - डीबग करने के लिए उपयोग नहीं किया जाता है ... यदि आप डीबग करना चाहते हैं, तो बस f12 को हिट करें और कंसोल खोलें: ) -1 क्योंकि आपको चेक करना चाहिए कि कंसोल ओवरराइट करने से पहले मौजूद है या नहीं।
1nfiniti

कुछ IE प्लगइन्स कंसोल और कंसोल.लॉग को परिभाषित करते हैं, लेकिन खाली ऑब्जेक्ट के रूप में, फ़ंक्शंस नहीं।
लिलिथ नदी

24

मुझे वास्तव में "ऑरेंज 80" द्वारा पोस्ट किया गया दृष्टिकोण पसंद है। यह सुरुचिपूर्ण है क्योंकि आप इसे एक बार सेट कर सकते हैं और इसे भूल सकते हैं।

अन्य तरीकों से आपको कुछ अलग करने की आवश्यकता होती है ( console.log()हर बार सादे के अलावा कुछ और कॉल करें ), जो सिर्फ परेशानी पूछ रहा है ... मुझे पता है कि मैं अंततः भूल जाऊंगा।

एक उपयोगिता फ़ंक्शन में कोड को लपेटकर मैंने इसे एक कदम आगे बढ़ाया है, जिसे आप अपनी जावास्क्रिप्ट की शुरुआत में एक बार कॉल कर सकते हैं, कहीं भी किसी भी लॉगिंग से पहले। (मैं इसे अपनी कंपनी के इवेंट डेटा राउटर उत्पाद में स्थापित कर रहा हूं। यह इसके नए व्यवस्थापक इंटरफ़ेस के क्रॉस-ब्राउज़र डिज़ाइन को सरल बनाने में मदद करेगा।)

/**
 * Call once at beginning to ensure your app can safely call console.log() and
 * console.dir(), even on browsers that don't support it.  You may not get useful
 * logging on those browers, but at least you won't generate errors.
 * 
 * @param  alertFallback - if 'true', all logs become alerts, if necessary. 
 *   (not usually suitable for production)
 */
function fixConsole(alertFallback)
{    
    if (typeof console === "undefined")
    {
        console = {}; // define it if it doesn't exist already
    }
    if (typeof console.log === "undefined") 
    {
        if (alertFallback) { console.log = function(msg) { alert(msg); }; } 
        else { console.log = function() {}; }
    }
    if (typeof console.dir === "undefined") 
    {
        if (alertFallback) 
        { 
            // THIS COULD BE IMPROVED… maybe list all the object properties?
            console.dir = function(obj) { alert("DIR: "+obj); }; 
        }
        else { console.dir = function() {}; }
    }
}

1
खुशी है कि आप इसे पसंद करते हैं :-) मैं इसका उल्लेख सटीक कारण के लिए करता हूं - बी / सी यह एक अच्छी सुरक्षा है। विकास के लिए अपने कोड में कुछ "कंसोल.लॉग" स्टेटमेंट डालना और बाद में उन्हें हटाना भूल जाना बहुत आसान है। कम से कम यदि आप ऐसा करते हैं, और इसे हर उस फ़ाइल के शीर्ष पर रखें जहाँ आप कंसोल का उपयोग करते हैं। आपके पास कभी भी ग्राहकों के ब्राउज़र में साइट को तोड़ने की स्थिति नहीं होगी b / c वे कंसोल पर विफल होते हैं। मुझे पहले बचाया! अच्छा सुधार, btw :-)
jpswain

1
"यह बहुत आसान तरीका है ... उन्हें हटाना भूल जाओ"। एक उपयोगी चीज जो मैं हमेशा अस्थायी डिबग लॉगिंग के साथ करता हूं, /**/console.log("...");वह एक खाली टिप्पणी के साथ कोड का उपसर्ग है, इसलिए अस्थायी कोड को खोजना और उसका पता लगाना आसान है।
लॉरेंस डॉल

8

यदि आपको अपने सभी कंसोल.लॉग कॉल के लिए "अपरिभाषित" मिलता है, तो संभवतः इसका मतलब है कि आपके पास अभी भी एक पुराना फायरबगलाइट लोड (फ़ायरबग.जेएस) है। यह IE8 के सभी मान्य कार्यों को ओवरराइड करेगा। हालांकि वे मौजूद हैं। वैसे भी मेरे साथ ऐसा ही हुआ है।

कंसोल ऑब्जेक्ट को ओवरराइड करने वाले अन्य कोड की जाँच करें।


5

किसी भी ब्राउज़र में कंसोल की कमी का सबसे अच्छा समाधान है:

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

1
इसमें ग्लेरिंग समस्या है जो कंसोल या कंसोल का उपयोग करके लॉग की गई ऑब्जेक्ट्स या स्ट्रिंग्स ।GroupCollapsed पूरी तरह से गायब हो जाएगी। यह अनावश्यक है, उन्हें कंसोल.लॉग पर मैप किया जाना चाहिए, यदि यह उपलब्ध है।
बेन

3

बहुत सारे जवाब हैं। इसके लिए मेरा समाधान था:

globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
    console = {};
    console.log = function(message) {globalNamespace.globalArray.push(message)};   
}

संक्षेप में, यदि कंसोल.लॉग मौजूद नहीं है (या इस मामले में, खोला नहीं गया है) तो लॉग को एक वैश्विक नामस्थान सरणी में संग्रहीत करें। इस तरह, आप लाखों अलर्ट के साथ परेशान नहीं होते हैं और आप अभी भी डेवलपर लॉग को खोलने या बंद करने के साथ अपने लॉग देख सकते हैं।


2
अगर (window.console && 'फ़ंक्शन' === टाइपोफ़ window.console.log) {
    window.console.log (ओ);
}

आप कह रहे हैं कि window.console.log()IE8 में उपलब्ध हो सकता है जब console.log()भी नहीं है?
18

यहाँ समस्या यह है कि typeof window.console.log === "object", नहीं"function"
Isochronous

2

यहाँ मेरा "IE कृपया दुर्घटना नहीं है"

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

1

मुझे यह गितुब पर मिला :

// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function f() {
    log.history = log.history || [];
    log.history.push(arguments);
    if (this.console) {
        var args = arguments,
            newarr;
        args.callee = args.callee.caller;
        newarr = [].slice.call(args);
        if (typeof console.log === 'object') log.apply.call(console.log, console, newarr);
        else console.log.apply(console, newarr);
    }
};

// make it safe to use console.log always
(function(a) {
    function b() {}
    for (var c = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","), d; !! (d = c.pop());) {
        a[d] = a[d] || b;
    }
})(function() {
    try {
        console.log();
        return window.console;
    } catch(a) {
        return (window.console = {});
    }
} ());

1

मैं ऊपर से वाल्टर के दृष्टिकोण का उपयोग कर रहा हूं (देखें: https://stackoverflow.com/a/14246240/3076102 )

मैं एक समाधान में मिलाता हूं जो मैंने यहां पाया https://stackoverflow.com/a/7967670 ऑब्जेक्ट्स को ठीक से दिखाने के लिए।

इसका मतलब है कि ट्रैप फ़ंक्शन बन गया है:

function trap(){
    if(debugging){
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var index;
        for (index = 0; index < args.length; ++index) {
            //fix for objects
            if(typeof args[index] === 'object'){ 
                args[index] = JSON.stringify(args[index],null,'\t').replace(/\n/g,'<br>').replace(/\t/g,'&nbsp;&nbsp;&nbsp;');
            }
        }
        var message = args.join(' ');
        console.messages.push(message);
        // instead of a fallback function we use the next few lines to output logs
        // at the bottom of the page with jQuery
        if($){
            if($('#_console_log').length == 0) $('body').append($('<div />').attr('id', '_console_log'));
            $('#_console_log').append(message).append($('<br />'));
        }
    }
} 

मुझे आशा है कि यह मददगार है:-)


0

यह IE8 में काम करता है। IE8 के डेवलपर टूल को F12 मारकर खोलें।

>>console.log('test')
LOG: test

6
यह मेरे मामले में "अपरिभाषित" है।
एक्मे 25'10

6
जैसा कि मिस्टर लकी ने बताया: "कंसोल.लॉग तब ही उपलब्ध होता है जब आपने डेवलपर टूल (F12 को खोलने और बंद करने के लिए टॉगल) किया हो।"
साइलेंसर

0

मुझे यह तरीका पसंद है (jquery के doc तैयार का उपयोग करके) ... यह आपको कंसोल का उपयोग करने में भी मदद करता है ... केवल पकड़ यह है कि यदि आप पृष्ठ लोड होने के बाद यानी देव के उपकरण खोलते हैं तो आपको पृष्ठ को फिर से लोड करना होगा ...

यह सभी कार्यों के लिए लेखांकन द्वारा चालाक हो सकता है, लेकिन मैं केवल लॉग का उपयोग करता हूं इसलिए यह वही है जो मैं करता हूं।

//one last double check against stray console.logs
$(document).ready(function (){
    try {
        console.log('testing for console in itcutils');
    } catch (e) {
        window.console = new (function (){ this.log = function (val) {
            //do nothing
        }})();
    }
});

0

यहां एक संस्करण है जो डेवलपर टूल के खुलने पर कंसोल में लॉग इन करेगा और बंद होने पर नहीं।

(function(window) {

   var console = {};
   console.log = function() {
      if (window.console && (typeof window.console.log === 'function' || typeof window.console.log === 'object')) {
         window.console.log.apply(window, arguments);
      }
   }

   // Rest of your application here

})(window)

अच्छा है कि यह दायरे में सीमित है, केस का समर्थन कर सकता है जब IE8 DevTools कोड निष्पादन के बीच में खुले हैं, लेकिन यह IE8 में काम नहीं करता है, कंसोल .log एक ऑब्जेक्ट है, इसलिए इसकी कोई applyविधि नहीं है।
निशि

0

Html में अपना खुद का कंसोल बनाएं।; ;-) यह अंकित किया जा सकता है, लेकिन आप इसके साथ शुरू कर सकते हैं:

if (typeof console == "undefined" || typeof console.log === "undefined") {
    var oDiv=document.createElement("div");
    var attr = document.createAttribute('id'); attr.value = 'html-console';
    oDiv.setAttributeNode(attr);


    var style= document.createAttribute('style');
    style.value = "overflow: auto; color: red; position: fixed; bottom:0; background-color: black; height: 200px; width: 100%; filter: alpha(opacity=80);";
    oDiv.setAttributeNode(style);

    var t = document.createElement("h3");
    var tcontent = document.createTextNode('console');
    t.appendChild(tcontent);
    oDiv.appendChild(t);

    document.body.appendChild(oDiv);
    var htmlConsole = document.getElementById('html-console');
    window.console = {
        log: function(message) {
            var p = document.createElement("p");
            var content = document.createTextNode(message.toString());
            p.appendChild(content);
            htmlConsole.appendChild(p);
        }
    };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.