क्या IE9 कंसोल.लॉग का समर्थन करता है, और क्या यह एक वास्तविक कार्य है?


209

window.console.logInternet Explorer 9 में किन परिस्थितियों में परिभाषित किया गया है?

यहां तक ​​कि जब window.console.logपरिभाषित किया गया है, window.console.log.applyऔर window.console.log.callअपरिभाषित हैं। ऐसा क्यों है?

[IE8 के लिए संबंधित प्रश्न: IE8 में कंसोल.लॉग का क्या हुआ? ।]


3
IE8-9 कंसोल ऑब्जेक्ट / फ़ंक्शन की पेचीदगियों के बारे में इस महान पोस्ट को देखें: whattheheadsaid.com/2011/04/…
Marc Climent


@MarcCliment लिंक मृत है
chakeda

जब मैं ऐसा करता हूं तो @chakeda से मुझे नफरत है, वेब आर्काइव से लिंक है: web.archive.org/web/2014062505085155/http://whattheheadsaid.com/…
मार्क क्लेमेंट

जवाबों:


299

Internet Explorer 9 (और 8) में, consoleऑब्जेक्ट केवल तब प्रकट होता है जब डेवलपर टूल किसी विशेष टैब के लिए खोले जाते हैं। यदि आप उस टैब के लिए डेवलपर टूल विंडो छिपाते हैं, तो consoleआपके द्वारा नेविगेट किए गए प्रत्येक पृष्ठ के लिए ऑब्जेक्ट उजागर रहता है। यदि आप एक नया टैब खोलते हैं, तो आपको उस टैब के लिए डेवलपर टूल भी खोलना होगा, ताकि consoleऑब्जेक्ट सामने आए।

consoleवस्तु किसी भी मानक का हिस्सा नहीं है और दस्तावेज़ ऑब्जेक्ट मॉडल के लिए एक विस्तार है। अन्य DOM ऑब्जेक्ट्स की तरह, इसे एक होस्ट ऑब्जेक्ट माना जाता है और इसे इनहेरिट करने की आवश्यकता नहीं है Object, न ही इसके तरीकों से Function, जैसे कि ECMAScript फ़ंक्शंस और ऑब्जेक्ट्स करते हैं। यही कारण है applyऔर callउन तरीकों पर अपरिभाषित हैं। IE 9 में, अधिकांश डोम ऑब्जेक्ट्स को मूल ECMAScript प्रकारों से विरासत में प्राप्त किया गया था। जैसा कि डेवलपर टूल IE (एक्सटेंशन, बिल्ट-इन एक्सटेंशन) के लिए एक एक्सटेंशन माना जाता है, वे स्पष्ट रूप से बाकी डोम के समान सुधार प्राप्त नहीं करते थे।

इसके लायक क्या है, आप अभी भी थोड़े से जादू के साथ कुछ Function.prototypeतरीकों का उपयोग कर सकते हैं :consolebind()

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

2
फायरबग की consoleवस्तु के लिए भी यही सच है ।
मार्सेल कोर्पल

150
मैं अन-गर्व के साथ कह सकता हूं कि मैंने कई वर्षों तक वेब के लिए विकसित किया था जिसे मैंने कंसोल माना था। सभी प्रमुख ब्राउज़रों द्वारा समर्थित है। मैंने सिर्फ एक दिन बिताया है कि क्यों IE9 को मेरी स्क्रिप्ट पसंद नहीं है और अब मुझे पता है कि क्यों - इसके पहले चरण में एक कंसोल था। डिबग करने के लिए असंभव, क्योंकि डिबग मोड को चालू करने से यह बग एक पल में दूर हो गया: पी स्पष्टीकरण के लिए धन्यवाद !!
f055

2
कल भी यही समस्या थी। DebugBar को स्थापित करने से मुझे तुरंत मदद मिली क्योंकि यह कंसोल ऑब्जेक्ट को परिभाषित नहीं करता है। इसलिए जब मैंने IE कंसोल को छुपाया, लेकिन डीबगबर को नहीं, तो मुझे बाद का संदेश मिला कि जावास्क्रिप्ट त्रुटि थी (कंसोल परिभाषित नहीं है)।
बजे साइमन ए। यूगस्टर

आईई @ f055
लकी अली

7
इंटरनेट विकल्प -> उन्नत -> प्रत्येक स्क्रिप्ट त्रुटि के बारे में एक सूचना प्रदर्शित करें। वेब डेवलपर्स को हमेशा IE में इस चेक को छोड़ देना चाहिए। यह आपको कंसोल के बारे में सूचित करता है, या लॉग फ़ंक्शन अपरिभाषित है ... संदेश को ठीक से याद नहीं कर सकता है।
सेठ फूल

166

इस कंसोल के लिए एक सरल समाधान है। समस्या आपके जेएस कोड की शुरुआत में निम्नलिखित को परिभाषित करने के लिए है:

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

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


8
अधिक जानकारी, और अधिक मजबूत कंसोल प्रतिस्थापन (अन्य कंसोल विधियों सहित): stackoverflow.com/questions/8002116/…
Zach Lysobey

@ZachL: कंक्रीट में कौन से ठीक हैं?
हकर्रे

मेरे उत्तर में एक दृष्टिकोण है: 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

कंसोल। केवल तभी परिभाषित किया जाता है जब कंसोल खुला होता है। यदि आप अपने कोड में इसके लिए जाँच करना चाहते हैं, तो सुनिश्चित करें कि आप इसके लिए विंडो प्रॉपर्टी के लिए जाँच करें

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

यह IE9 में एक अपवाद फेंकता है और सही ढंग से काम नहीं करेगा। यह मत करो

if (console) 
    console.log(msg)

6

ऊपर मार्क क्लिंटन की टिप्पणी के लेख को पढ़ने के बाद, मैंने अब अपना सर्व-उद्देश्य क्रॉस-ब्राउज़र कंसोल.लॉग फ़ंक्शन जैसे दिखने के लिए बदल दिया है:

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);
विक्टर

@ यह निश्चित रूप से केवल एक ही स्वीकृत उत्तर होना चाहिए!
पावेल फ्रेंकोव

0

मैं उल्लेख करना चाहूंगा कि IE9 त्रुटि को नहीं बढ़ाता है यदि आप Windows के सभी संस्करणों पर बंद डेवलपर टूल के साथ कंसोल का उपयोग करते हैं। XP पर यह करता है, लेकिन विंडोज 7 पर यह नहीं है। तो अगर आपने सामान्य रूप से WinXP के लिए समर्थन छोड़ दिया है, तो आप कंसोल का उपयोग करके ठीक हैं। सीधे सीधे।


-1

कैसा रहेगा...

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

1
यह कुछ मामलों में एक पास करने योग्य समाधान हो सकता है, लेकिन आपने वास्तव में प्रश्न को संबोधित नहीं किया है।
pswg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.