IE में डेवलपर टूल खोलने के बाद जावास्क्रिप्ट केवल काम क्यों करता है?


638

IE9 बग - जावास्क्रिप्ट केवल एक बार डेवलपर टूल खोलने के बाद काम करता है।

हमारी साइट उपयोगकर्ताओं को मुफ्त पीडीएफ़ डाउनलोड प्रदान करती है, और इसमें एक सरल "डाउनलोड करने के लिए पासवर्ड दर्ज करें" फ़ंक्शन है। हालाँकि, यह Internet Explorer में बिल्कुल काम नहीं करता है।

आप इस उदाहरण में अपने लिए देख सकते हैं ।

डाउनलोड पास "makeuseof" है। किसी भी अन्य ब्राउज़र में, यह ठीक काम करता है। IE में, दोनों बटन कुछ नहीं करते हैं।

सबसे अधिक जिज्ञासु बात यह है कि यदि आप F12 के साथ डेवलपर टूलबार को खोलते और बंद करते हैं, तो यह अचानक काम करना शुरू कर देता है।

हमने संगतता मोड की कोशिश की है और इस तरह, कुछ भी फर्क नहीं पड़ता है।

मैं इंटरनेट एक्सप्लोरर में यह काम कैसे करूं?


3
क्रॉस-ब्राउज़र आवरण का उपयोग करें: github.com/MichaelZelensky/log.js
माइकल ज़ेलेन्स्की

1
एक अच्छा विकल्प, यदि आपके पास एक बिल्ड कदम है, तो कुछ का उपयोग करना है gulp-strip-debug। यह सभी console.*तरीकों को हटाता है, उत्पादन बनाता है या IE में परीक्षण के लिए महान है।
जाने

15
भविष्य के गोगलर्स के लिए: मेरे पास एक ही लक्षण थे, लेकिन IE11 में। खैर, यह पता चला कि इसका उत्तर संबंधित नहीं था console, लेकिन मेरे अनुरोध के कोणीय और कैशिंग के उपयोग से था। अधिक के लिए यहां और यहां उत्तर देखें ।
क्रिस्टोफर लेप्टे

@ChristofferLette हाँ, मेरे पास एक ही मुद्दा है कि कृपया stackoverflow.com/questions/31428126/… कोड को ठीक से काम करें जब डेवलपर्स उपकरण खोले जाएं ..
प्रणव बिलूरकर

5
इस तरह की समस्याओं के बारे में सबसे कष्टप्रद बात? वे डिबग करना लगभग असंभव है क्योंकि डेवलपर कंसोल को खोलते ही यह काम करना शुरू कर देता है।
jlewkovich

जवाबों:


815

ऐसा लगता है कि आपके जावास्क्रिप्ट में कुछ डिबगिंग कोड हो सकते हैं।

आप जिस अनुभव का वर्णन कर रहे हैं, वह उस कोड का विशिष्ट है, जिसमें console.log()कोई अन्य consoleकार्यक्षमता शामिल है।

consoleवस्तु केवल सक्रिय जब देव टूलबार खोला जाता है है। इससे पहले, कंसोल ऑब्जेक्ट को कॉल करने के परिणामस्वरूप इसे रिपोर्ट किया जाएगा undefined। टूलबार खोले जाने के बाद, कंसोल मौजूद होगा (भले ही टूलबार बाद में बंद हो जाए), इसलिए आपका कंसोल कॉल तब काम करेगा।

इसके कुछ समाधान हैं:

सबसे स्पष्ट है कि आपके कोड को संदर्भों को हटाने के माध्यम से जाना है console। आपको वैसे भी उत्पादन कोड में सामान नहीं छोड़ना चाहिए।

यदि आप कंसोल संदर्भों को रखना चाहते हैं, तो आप उन्हें एक if()बयान में लपेट सकते हैं , या कुछ अन्य सशर्त जो यह जांचते हैं कि क्या कॉल करने की कोशिश करने से पहले कंसोल ऑब्जेक्ट मौजूद है या नहीं।


8
क्या डिबगिंग कोड को छोड़ने के लिए कोई वर्कअराउंड हैं? IE इस
अयोग्य

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

79
@ मीकोही if(!console)एक ही त्रुटि का कारण होगा - इसे पढ़ना चाहिएif(!window.console)
mindplay.dk

9
इसलिए ... IE को एक ऐसी सुविधा को लागू नहीं करना चाहिए जो हर नए js देव हर समय उपयोग करता है, कुछ देवों को परेशान करने से बचने के लिए जो उस स्क्रिप्ट को इस्तेमाल करते हैं जो उस चीज़ को ठीक करने के लिए उपयोग किया जाना चाहिए जो पहले स्थान पर काम करना चाहिए था ... लेकिन यह अनुचित है उस के लिए आईई दस्तक करने के लिए आप बहुत उदार व्यक्ति हैं स्पुडली !!! :)
जॉर्डन डेविस

7
अभी भी IE11 के साथ होता है
माइकल

162

HTML5 बॉयलरप्लेट में कंसोल समस्याओं को ठीक करने के लिए एक अच्छा पूर्व-निर्मित कोड है:

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

जैसा कि @ प्लस- ने टिप्पणियों में बताया, नवीनतम संस्करण उनके GitHub पृष्ठ पर उपलब्ध है


8
@Plus की टिप्पणी में लिंक अब मान्य नहीं है। कोड को srcउप-डायर में नीचे धकेल दिया गया है : github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
क्रिस्टोफर लेटे

153

यहाँ console.logसमस्या के अलावा एक और संभावित कारण है (कम से कम IE11 में):

जब कंसोल खुला नहीं है, तो IE बहुत आक्रामक कैशिंग करता है, इसलिए सुनिश्चित करें कि किसी भी $.ajaxकॉल या XMLHttpRequestकॉल में कैशिंग सेट झूठी है।

उदाहरण के लिए:

$.ajax({cache: false, ...})

जब डेवलपर कंसोल खुला होता है, तो कैशिंग कम आक्रामक होता है। एक बग (या शायद एक सुविधा हो सकता है?)


9
यह सिर्फ मुझे बचाया;) धन्यवाद! मैं कहूंगा कि यह एक बग है क्योंकि आपको अपनी वेबसाइट को कंसोल ओपन और क्लोज करने के साथ ही परीक्षण करने और डिबग करने की समान शर्तें होनी चाहिए।
चोंच

मेरे लिए काम किया। विशेष रूप से: stackoverflow.com/questions/13391563/…
user1062589

2
यह अधिक होना चाहिए क्योंकि मुझे लगता है कि वास्तविक उत्तर है ... कंसोल के संबंध में स्वीकृत उत्तर। कुछ IE संस्करण में एक त्रुटि है, यहां वर्णित व्यवहार का कारण नहीं होगा।
मिग

63

इससे मेरी समस्या हल हो गई जब मैंने इसमें मामूली बदलाव किया। IE9 समस्या को ठीक करने के लिए मैंने अपने html पृष्ठ में निम्नलिखित जोड़ा:

<script type="text/javascript">
    // IE9 fix
    if(!window.console) {
        var console = {
            log : function(){},
            warn : function(){},
            error : function(){},
            time : function(){},
            timeEnd : function(){}
        }
    }
</script>

1
यह समाधान IE 11 पर विंडोज 7 64-बिट पर काम नहीं करता है।
विक्रम १

1
इसने विंडोज 7 64-बिट पर IE 11 पर मेरी समस्या हल कर दी।
ज़ोनयांग

29

consoleस्वीकृत उत्तर और अन्य में उल्लिखित ' ' उपयोग के मुद्दे के अलावा, कम से कम एक और कारण है कि कभी-कभी Internet Explorer में पृष्ठ केवल डेवलपर टूल सक्रिय होने के साथ काम करते हैं।

जब डेवलपर टूल सक्षम होता है, तो IE वास्तव में अपने HTTP कैश (कम से कम IE 11 में डिफ़ॉल्ट रूप से) का उपयोग नहीं करता है, जैसे कि यह सामान्य मोड में होता है।

इसका मतलब है कि अगर आपकी साइट या पेज पर कैशिंग की समस्या है (यदि यह उदाहरण के लिए इससे अधिक कैश करता है - यही मेरा मामला था), तो आप उस समस्या को F12 मोड में नहीं देखेंगे। इसलिए यदि जावास्क्रिप्ट कुछ कैश किए गए AJAX अनुरोधों को करता है, तो वे सामान्य मोड में अपेक्षा के अनुरूप काम नहीं कर सकते हैं, और F12 मोड में ठीक काम कर सकते हैं।


1
कैसे xmlHttpReq अनुरोधों को अक्षम करने के लिए stackoverflow.com/questions/3984961/… देखें ।
माइकल रॉस

1
मिठाई। यह आश्चर्यजनक रूप से काम आया। मुझे लगता है कि एंगुलर की $ http सेवा बस्ट को कैश नहीं करती है जैसा कि मैंने सोचा था कि यह होगा।

17

मुझे लगता है कि यह जावास्क्रिप्ट के किसी भी टैग से पहले इसे जोड़ने में मदद कर सकता है:

try{
  console
}catch(e){
   console={}; console.log = function(){};
}

11
try catchयह पता लगाने के लिए कि एक चर मौजूद है एक बुरा विचार है। न केवल यह धीमा है, लेकिन यदि आपके प्रयास ब्लॉक में एक से अधिक कथन हैं, तो आप एक अलग कारण के लिए अपवाद प्राप्त कर सकते हैं। यह प्रयोग न करें, बहुत कम से कम उपयोग करेंif (typeof console == 'undefined')
जुआन मेंडेस

8

यदि आप AngularJS संस्करण 1.X का उपयोग कर रहे हैं तो आप सीधे कंसोल का उपयोग करने के बजाय $ लॉग सेवा का उपयोग कर सकते हैं।

लॉगिंग के लिए सरल सेवा। डिफ़ॉल्ट कार्यान्वयन सुरक्षित रूप से ब्राउज़र के कंसोल में संदेश लिखता है (यदि मौजूद है)।

https://docs.angularjs.org/api/ng/service/$log

तो अगर आपके पास भी कुछ ऐसा ही है

angular.module('logExample', [])
  .controller('LogController', ['$scope', function($scope) {
    console.log('Hello World!');
 }]);

आप इसे बदल सकते हैं

angular.module('logExample', [])
  .controller('LogController', ['$scope', '$log', function($scope, $log) {
    $log.log('Hello World!');
 }]);

कोणीय 2+ में कोई अंतर्निहित लॉग सेवा नहीं है


इसने मेरी मदद की, धन्यवाद- टाइपस्क्रिप्ट का उपयोग करने वाले किसी और के लिए, यह कोणीय परिभाषाओं में "ILogService" है
DannykPowell

IIRC $ लॉग का उपयोग करते हुए लॉग स्टेटमेंट का स्थान कंसोल का उपयोग करते समय, इसके विपरीत अस्पष्ट हो जाता है। विकास के दौरान मेरे अनुभव से इतना महान नहीं।
जेसीडाहल

5

यदि आप उपयोग कर रहे हैं angularऔर अर्थात 9, 10या edgeउपयोग कर रहे हैं:

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

पूरी तरह से निष्क्रिय करने के लिए cache


4

यह मेरे लिए IE 11 में हुआ। और मैं jquery .लोड फ़ंक्शन को कॉल कर रहा था। तो मैंने इसे पुराने तरीके से किया और कैशिंग को अक्षम करने के लिए कुछ भी यूआरएल में डाल दिया।

$("#divToReplaceHtml").load('@Url.Action("Action", "Controller")/' + @Model.ID + "?nocache=" + new Date().getTime());

2

मुझे अब तक रनर द्वारा दिए गए समाधानों के लिए एक और विकल्प मिला है और टूड्रेसडे जो कि स्पुडली के उत्तर में टिप्पणियों में चर्चा की गई खराबी से बचता है :

        try {
            console.log(message);
        } catch (e) {
        }

यह थोड़ा डरावना है लेकिन दूसरी ओर यह संक्षिप्त है और रनर्स के उत्तर में शामिल सभी लॉगिंग विधियों को कवर करता है और इसका बहुत बड़ा फायदा है कि आप किसी भी समय IE के कंसोल विंडो को खोल सकते हैं और लॉग्स में बहते हुए आते हैं।


0

हम विंडोज 7 और विंडोज 10 पर IE 11 पर इस समस्या में भाग गए। हमने पता लगाया कि वास्तव में IE (IE> इंटरनेट विकल्प> उन्नत टैब> ब्राउजिंग> ब्राउज> अनचेक स्क्रिप्ट डिबगिंग (इंटरनेट एक्सप्लोरर) ) के लिए डिबगिंग क्षमताओं को चालू करने से क्या समस्या थी । यह सुविधा आम तौर पर डोमेन व्यवस्थापक द्वारा हमारे पर्यावरण के भीतर जाँच की जाती है।

समस्या यह थी क्योंकि हम console.debug(...)अपने जावास्क्रिप्ट कोड के भीतर विधि का उपयोग कर रहे थे । डेवलपर (मेरे) द्वारा की गई धारणा यह थी कि अगर ग्राहक डेवलपर उपकरण कंसोल स्पष्ट रूप से खुला नहीं था, तो मैं कुछ भी नहीं लिखना चाहता था। जबकि क्रोम और फ़ायरफ़ॉक्स इस रणनीति से सहमत थे, IE 11 को यह एक सा पसंद नहीं था। सभी console.debug(...)कथनों को console.log(...)कथनों में बदलकर , हम क्लाइंट कंसोल में अतिरिक्त जानकारी को लॉग इन करना जारी रख सकते हैं और इसे तब खोलकर देख सकते हैं, लेकिन अन्यथा इसे विशिष्ट उपयोगकर्ता से छिपा कर रखें।


0

मैंने अपने मुद्दे के लिए प्रस्ताव रखा और ठीक किया। AJAX के अनुरोध की तरह लगता है कि मैंने अपने जावास्क्रिप्ट को अंदर डाला है क्योंकि यह प्रक्रिया नहीं हो रही थी क्योंकि मेरे पेज में कुछ कैश की समस्या थी। यदि आपकी साइट या पृष्ठ में कोई कैशिंग समस्या है, तो आपको वह समस्या डेवलपर्स / F12 मोड में दिखाई नहीं देगी। मेरे कैश्ड जावास्क्रिप्ट AJAX अनुरोधों के अनुसार यह काम नहीं कर सकता है और निष्पादन का कारण बनता है जिसे तोड़ने में F12 की कोई समस्या नहीं है। इसलिए कैश को झूठा बनाने के लिए सिर्फ नया पैरामीटर जोड़ा गया है।

$.ajax({
  cache: false,
});

ऐसा लगता है कि IE को विशेष रूप से झूठे होने की आवश्यकता है ताकि AJAX और जावास्क्रिप्ट गतिविधि अच्छी तरह से चले।

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