jQuery ने तुल्यकालिक XMLHTTPRequest को अपदस्थ कर दिया है


119

कई अन्य लोगों की तरह, मेरी वेबसाइट jQuery का उपयोग कर रही है। जब मैं डेवलपर टूल खोलता हूं, तो मुझे एक चेतावनी दिखाई देती है जो कहती है कि XMLHTTPRequest है

अंतिम उपयोगकर्ता के अनुभव पर इसके हानिकारक प्रभाव के कारण पदावनत।

मैंने दस्तावेज़ीकरण का हिस्सा पढ़ा और पढ़ा , लेकिन यह काफी तकनीकी था। क्या कोई व्यक्ति सरल शब्दों में XMLHTTPRequest से WHATWG में स्थानांतरण के परिणामों की व्याख्या कर सकता है? यह कहता है कि यह 2012 में हुआ।

इसके अलावा, प्रलेखन का कहना है कि श्रमिकों के बाहर सिंक्रोनस XMLHttpRequest वेब प्लेटफॉर्म से निकाले जाने की प्रक्रिया में है, जब ऐसा होता है, यदि किसी उपयोगकर्ता एजेंट ने उन्हें एक सेवा में रखा था, तो क्या उन्हें अपने मौजूदा कोड को संशोधित करने की आवश्यकता है?


2
आप तुल्यकालिक XMLHTTPRequests के बारे में बात कर रहे होंगे, अतुल्यकालिक नहीं, सही? अंत उपयोगकर्ता अनुभव के लिए तुल्यकालिक अनुरोध भयानक हैं (वे अनुरोध के दौरान ब्राउज़र को बंद कर देते हैं) और आमतौर पर इसका उपयोग नहीं किया जाना चाहिए।
jfriend00

2
कुछ कोड प्रदान करते हैं जो इसे ट्रिगर करते हैं
charlietfl

3
क्या यह प्रश्न में पूर्ण पाठ है? मुख्य थ्रेड पर सिंक्रोनस XMLHttpRequest अंत उपयोगकर्ता के अनुभव के लिए हानिकारक प्रभावों के कारण हटा दिया गया है।
कंतस 94 हेवी

1
jQuery केवल तुल्यकालिक अनुरोधों के लिए यह चेतावनी देता है, है ना? क्या आप जानबूझकर एक तुल्यकालिक अनुरोध कर रहे हैं? यदि हां, तो समाधान आपके कोड को अतुल्यकालिक अनुरोधों के साथ काम करने के लिए तैयार करना है, जो आपको वैसे भी करना चाहिए क्योंकि वे उपयोगकर्ता के दृष्टिकोण से बहुत अच्छे हैं।
nnnnnn

1
मैंने उस झंडे को न केवल अपनी वेबसाइट में देखा है, मैंने इसे कुछ अन्य लोगों, जैसे Youtube, भी देखा है। विशिष्टताओं के संबंध में, W3C या WHATWG के अनुपालन में मेरा विनिर्देश क्या होना चाहिए? , संदर्भ , मैं इसके लिए मुख्य सूत्र में नहीं पूछना चाहता हूं क्योंकि मुझे लगता है कि यह राय का मामला है। @ Qantas94Heavy
एडी

जवाबों:


136

इस चेतावनी से बचने के लिए, उपयोग न करें:

async: false

आपके किसी भी $.ajax()कॉल में। यह उसी की एकमात्र विशेषता है, XMLHttpRequestजो कि पदावनत है।

डिफ़ॉल्ट है async: true, इसलिए यदि आप कभी भी इस विकल्प का उपयोग नहीं करते हैं, तो आपका कोड सुरक्षित होना चाहिए यदि सुविधा कभी भी हटा दी जाती है।

हालाँकि, यह शायद नहीं होगा - इसे मानकों से हटाया जा सकता है, लेकिन मैं शर्त लगाता हूँ कि ब्राउज़र कई वर्षों तक इसका समर्थन करते रहेंगे। तो अगर आपको वास्तव में किसी कारण से तुल्यकालिक AJAX की आवश्यकता है, तो आप उपयोग कर सकते हैं async: falseऔर बस चेतावनी को अनदेखा कर सकते हैं । लेकिन अच्छे कारण हैं कि तुल्यकालिक AJAX को खराब शैली क्यों माना जाता है, इसलिए आपको संभवतः इससे बचने का एक तरीका खोजने की कोशिश करनी चाहिए। और जिन लोगों ने फ्लैश एप्लिकेशन लिखे, उन्होंने शायद कभी नहीं सोचा था कि यह या तो चला जाएगा, लेकिन यह अभी चरणबद्ध होने की प्रक्रिया में है।

ध्यान दें कि जो FetchAPI बदल रहा XMLHttpRequestहै वह समकालिक विकल्प की पेशकश भी नहीं करता है।


9
यह तो jQuery की चेतावनी है। मैं इसे अनदेखा कर सकता हूं? मैं सर्वर पर तुल्यकालिक कॉल का उपयोग नहीं करता। मेरे लिए पूर्णतावादी पक्ष को चेतावनी देना बिल्कुल पसंद नहीं है।
जॉर्डन

2
@ जोर्डन मुझे लगता है कि चेतावनी ब्राउज़र से आ रही है, jQuery नहीं। जब भी आप सिंक्रोनस AJAX का उपयोग करने का प्रयास करेंगे तो यह होगा। यदि आप jQuery का उपयोग करते हैं, तो यह केवल तभी होगा जब आप उस विकल्प को निर्दिष्ट करेंगे $.ajax
बमर

2
मैं उपयोग कर रहा हूं jquery.i18n.properties.jsलेकिन $.ajax.आंतरिक रूप से शायद मेरी ओर से कोई स्पष्ट कॉल नहीं है, लेकिन निश्चित नहीं है।
मैनुअल जॉर्डन

1
वह प्लगइन .propertiesफाइलों से संसाधन बंडलों को लोड करता है। यह शायद ऐसा करने के लिए तुल्यकालिक AJAX का उपयोग कर रहा है, जिससे यह चेतावनी बनती है।
बरमार

1
@ManuelJordan सेटिंग async: i18n में सच है कि आपके पेज में धीमे कनेक्शन पर प्रदर्शित स्ट्रिंग्स दिखाने में देरी हो सकती है। स्ट्रिंग कोड के बजाय
शोइन

62

स्वीकृत उत्तर सही है, लेकिन मैंने एक और कारण पाया है यदि आप ASP.NET के तहत विजुअल स्टूडियो 2013 या उससे अधिक के साथ विकसित कर रहे हैं और सुनिश्चित करें कि आपने किसी भी तुल्यकालिक अजाक्स अनुरोध नहीं किए हैं या किसी भी स्क्रिप्ट को गलत स्थान पर परिभाषित नहीं किया है।

समाधान "ब्राउज़र लिंक" सुविधा को अक्षम करने के लिए वीएस टूलबार ड्रॉपडाउन में "सक्षम ब्राउज़र लिंक" को अनचेक करके थोड़ा ताज़ा आइकन इंगित करके घड़ी की दिशा में है। जैसे ही आप ऐसा करते हैं और पृष्ठ को पुनः लोड करते हैं, चेतावनियाँ बंद हो जानी चाहिए!

ब्राउज़र लिंक अक्षम करें

यह केवल स्थानीय स्तर पर डिबगिंग के दौरान ही होना चाहिए, लेकिन चेतावनी के कारण को जानना अभी भी अच्छा है।


यहां बताए अनुसार अंदर web.configजोड़कर एक को निष्क्रिय कर सकते हैं : poconosystems.com/software-development/…<add key="vs:EnableBrowserLink" value="false" /><appSettings>
बील

3
मुझे लगता है कि यह केवल कंसोल में चेतावनी संदेशों की सवारी करने के लिए एक बुरा सुझाव है। ब्राउज़रलिंक को अक्षम करें और उत्पादकता बढ़ाने से छुटकारा पाएं जो ब्राउज़रलिंक सिर्फ इसलिए जोड़ता है कि आपको ब्राउज़र कंसोल में चेतावनी संदेश दिखाई नहीं देगा? Microsoft के साथ बग दर्ज करने के लिए बेहतर है और यह ठीक हो जाता है।
कोडिंग 4fun

4
@ कोडिंग 4fun आपकी राय के लिए धन्यवाद; आप Microsoft के साथ बग दर्ज करने के लिए स्वतंत्र महसूस कर सकते हैं। मैं यह नहीं कह रहा था कि आपको ब्राउज़र लिंक को अक्षम करना चाहिए। मेरा उत्तर कुछ मामलों में इस चेतावनी के कारण के रूप में सटीक है और अपने स्वयं के कोड में कुछ बाहर शासन करने के लिए उपयोगी है। मुझे व्यक्तिगत रूप से बेहतर महसूस हुआ जब मैंने महसूस किया कि यह कुछ ऐसा नहीं है जो मैंने गलत किया और सोचा कि अन्य लोग इसे उपयोगी मान सकते हैं।
सैम

यह सिर्फ अजाक्स चेतावनी से ज्यादा तय है। मुझे एस्प कोर के उपयोग से जावास्क्रिप्ट कंसोल में सभी प्रकार के ब्राउज़र लिंक गड़बड़ मिले।
जोबस

क्या किसी को पता होगा कि ब्राउज़र लिंक क्या है और यह आखिरकार ऐसी चेतावनी क्यों देता है?
गिदोन

15

शरीर के खंड के अंत से ठीक पहले सिर के बाहर बाहरी जेएस का लिंक होने से मेरे साथ ऐसा हुआ। आप जानते हैं, इनमें से एक:

<script src="http://somesite.net/js/somefile.js">

इसका JQuery से कोई लेना-देना नहीं था।

आप शायद ऐसा ही कुछ करते हुए देखेंगे:

var script = $("<script></script>");
script.attr("src", basepath + "someotherfile.js");
$(document.body).append(script);

लेकिन मैंने उस विचार का परीक्षण नहीं किया है।


चेतावनी मेरे लिए चली गई जब मैंने इस तरह की एक लाइन को हटा दिया, जिसे मैं वैसे भी उपयोग नहीं कर रहा था: @ Html.Script ("~ / script / apps / appname.js")
MsTapp

10

यह @ हेनरी-चान द्वारा एक टिप्पणी के रूप में उल्लेख किया गया था , लेकिन मुझे लगता है कि यह कुछ और ध्यान देने योग्य है:

जब आप jQuery / जावास्क्रिप्ट का उपयोग करके नए html के साथ एक तत्व की सामग्री को अपडेट करते हैं, और इस नए HTML में <script>टैग होते हैं, तो उन्हें सिंक्रोनाइज़ किया जाता है और इस प्रकार यह त्रुटि उत्पन्न होती है। एक ही स्टाइलशीट के लिए जाता है।

आपको पता है कि यह तब हो रहा है जब आप XHRकंसोल विंडो में लोड की जा रही कई स्क्रिप्ट या स्टाइलशीट देख रहे हैं। (फ़ायरफ़ॉक्स)।


3

पिछले उत्तरों में से कोई भी (जो सभी सही हैं) मेरी स्थिति के अनुकूल था: मैं इसमें asyncपैरामीटर का उपयोग jQuery.ajax()नहीं करता हूं और मैं उस सामग्री के भाग के रूप में स्क्रिप्ट टैग शामिल नहीं करता हूं जिसे वापस लौटाया जा रहा था:

<div> 
     SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

मेरी स्थिति यह है कि मैं एक ही समय में दो divs को अद्यतन करने के उद्देश्य से लगातार दो AJAX अनुरोध कर रहा हूं:

function f1() {
     $.ajax(...); // XMLHTTP request to url_1 and append result to div_1
}

function f2() {
     $.ajax(...); // XMLHTTP request to url_2 and append result to div_2
}

function anchor_f1(){
$('a.anchor1').click(function(){
     f1();
})
}

function anchor_f2(){
$('a.anchor2').click(function(){
     f2();
});
}

// the listener of anchor 3 the source of problem
function anchor_problem(){
$('a.anchor3').click(function(){
     f1();
     f2();
});
}

anchor_f1();
anchor_f2();
anchor_problem();

जब मैं क्लिक करता हूं a.anchor3, तो यह चेतावनी ध्वज को उठाता है। मैंने click()फ़ंक्शन द्वारा f2 को प्रतिस्थापित करके समस्या को हल किया :

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}

5
यदि आप सीधे उन्हें DOM के भीतर HTML के माध्यम से सम्मिलित करते हैं तो स्क्रिप्ट निष्पादित नहीं की जाती हैं। इसलिए जब आप .html (), jQuery लाते हैं और HTML प्रतिक्रिया में शामिल किसी भी स्क्रिप्ट को सिंक्रोनाइज़ करते हैं।
हेनरी चान

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

2
@whitelettersinblankpapers मुझे लगता है कि उनका मतलब है: आपके ajax कॉलबैक के अंदर, यदि आपके द्वारा अपने "div" के लिए जो सामग्री जोड़ी जाती है, उसमें स्क्रिप्ट टैग होते हैं, तो इन्हें सिंक्रोनस कहा जाएगा।
हितम स्वेलेम

1

मेरा वर्कआउट: मैं एक बफर को कोड डंप करने के लिए अतुल्यकालिक अनुरोधों का उपयोग करता हूं। मेरे पास हर सेकंड बफर की जाँच करने वाला एक लूप है। जब डंप बफर पर आ गया है तो मैं कोड निष्पादित करता हूं। मैं एक टाइमआउट का भी उपयोग करता हूं। अंतिम उपयोगकर्ता के लिए पृष्ठ काम करता है जैसे कि तुल्यकालिक अनुरोधों का उपयोग किया जाएगा।


क्या आपको यह जानने के लिए थोड़ा कोड है कि इसे कैसे प्राप्त किया जाए?
ज़ेरोने

5
@runback, किया नहीं जा सकता () वादा कॉलबैक का उपयोग किया जा सकता है? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) आशा है कि मैंने कुछ गलत नहीं पढ़ा है।
प्रवीण

0

यदि हम आंशिक दृश्य में स्क्रिप्ट लोड करते हैं तो यह समस्या आ रही है

  1. मैंने आंशिक दृश्य में स्क्रिप्ट को हटा दिया और मुख्य दृश्य में चला गया।

यह समाधान मेरे लिए ठीक काम कर रहा है

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