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




internet-explorer internet-explorer-9 (10)

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

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

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

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

आप इस example में अपने लिए देख सकते हैं।

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

मुझे मिली सबसे उत्सुक बात यह है कि यदि आप एफ 12 के साथ डेवलपर टूलबार खोलते और बंद करते हैं, तो यह सब अचानक काम करना शुरू कर देता है।

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

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


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

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

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

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

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


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

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

टिप्पणियों में @ प्लस-पॉइंट के रूप में, नवीनतम संस्करण उनके गिटहब पेज पर उपलब्ध है


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

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

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


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

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


मुझे runeks और todotresde द्वारा प्रदान किए गए समाधानों के लिए एक और विकल्प मिला है जो Spudley के जवाब में टिप्पणियों में चर्चा की गई Spudley से Spudley :

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

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


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

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

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

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

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

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


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

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

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


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

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

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+ में कोई अंतर्निहित लॉग सेवा नहीं है


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

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




internet-explorer-9