2011-09-15 11 views
37

मान लीजिए कि मेरे पास कुछ वैश्विक अजाक्स ईवेंट हैंडलर परिभाषित हैं (AJAXStart, AJAXStop, और AJAXError)। आम तौर पर मैं इसके साथ ठीक हूं, लेकिन एक अनुरोध के लिए, मैं AJAXError हैंडलर को अक्षम करना चाहता हूं लेकिन फिर भी सामान्य रूप से AJAXStart और AJAXStop हैंडलर चलाता हूं। jQuery ajax function documentation "वैश्विक" पैरामीटर का उल्लेख करता है जिसे गलत पर सेट किया जा सकता है और सभी वैश्विक अजाक्स ईवेंट हैंडलरों को अक्षम करने के लिए $ .ajax फ़ंक्शन को पास किया जा सकता है, लेकिन वे कुछ वैश्विक हैंडलर को अक्षम करने के किसी भी तरीके का उल्लेख नहीं करते हैं।अनुरोध के लिए कुछ jQuery ग्लोबल अजाक्स इवेंट हैंडलर को अक्षम करना

मैं AJAXError फ़ंक्शन पर पारित AJAXSettings ऑब्जेक्ट की "url" प्रॉपर्टी पर एक परीक्षण करके AJAXError हैंडलर को रोक सकता हूं, लेकिन यह कुछ हद तक बेकार लगता है। क्या यहां कोई भी AJAXError फ़ंक्शन को चलाने से अक्षम करने का तरीका जानता है जो को उस स्थान पर देखेगा जहां $ .ajax फ़ंक्शन कहा जा रहा है?

यदि कोई इसे देखना चाहता है तो मैं एक साधारण उदाहरण प्रदान कर सकता हूं।

+0

क्या आपने कोशिश की है (और मैं इस पर अनुमान लगा रहा हूं) अपना 'आतंकवादी' हैंडलर '$ .ajax() 'कॉल में जोड़ रहा हूं और फिर प्रोसेसिंग को रोकने के लिए फ़ंक्शन के अंत में' वापसी झूठी 'डाल रहा हूं ? –

+0

हां, मैंने कोशिश की। इसने समस्या को ठीक नहीं किया। वैश्विक हैंडलर अभी भी भाग गया। –

+0

वैश्विक हैंडलर (सफलता, त्रुटि, पूर्ण) सफलतापूर्वक/त्रुटि/पूर्ण हैंडलर से पहले चलता है यदि मुझे सही याद है। –

उत्तर

85

यह संभव है और करना मुश्किल नहीं है।

आप बस अपनी वैश्विक त्रुटि हैंडलर (.ajaxError) मानकों के कुछ ही है कि jQuery इसे करने के लिए प्रदान कर सकते हैं प्राप्त करने के लिए सेटअप करने के लिए की जरूरत है:,

$("div.log").ajaxError(function(evt, xhr, settings) { 
    if(settings.suppressErrors) { 
     return; 
    } 

    // Normal processing 
}); 

इस के बाद आप किसी भी AJAX की सेटिंग के लिए suppressErrors: true जोड़ सकते हैं आपके द्वारा अनुरोध करने का अनुरोध करें, और यदि यह विफल हो जाता है तो त्रुटि हैंडलर सामान्य रूप से ऐसा करने के बिना वापस आ जाएगा।

See it in action

+0

यह अब तक का सबसे अच्छा जवाब जैसा दिखता है। मुझे आपका उदाहरण पसंद है। –

+0

मैंने आपके विचार की कोशिश की और यह काम किया। मैं शायद आपको बक्षीस दूंगा, जब तक कोई और अधिक सुंदर समाधान के साथ नहीं आ सकता। –

+0

यह उत्तर मेरी आवश्यकताओं के लिए पूरी तरह से पर्याप्त है इसलिए मैंने आपको बक्षीस देने का फैसला किया। –

7

की तरह अपने ajax अनुरोध में global: false इस्तेमाल करने की कोशिश:

$.ajax({ 
    url: "test.html", 
    global: false, 
    // ... 
}); 

स्रोत :: वैश्विक घटनाएं लिए http://docs.jquery.com/Ajax_Events

देखो।

+1

मैंने कोशिश की और यह सभी वैश्विक AJAX हैंडलर अक्षम कर दिया। मैं केवल कुछ वैश्विक AJAX हैंडलर को अक्षम करने की कोशिश कर रहा हूं। –

+1

इससे इसी तरह के मुद्दे के साथ बहुत मदद मिली। धन्यवाद! – mwcz

+0

यह सबसे अच्छा जवाब है जो मुझे लगता है कि –

14

जब आप jquery/AJAX स्रोत https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582 से कथन देते हैं, तो यह एक ही प्रकार में से एक है, यह स्पष्ट है कि आपकी समस्या अकेले jquery पैरामीटर द्वारा हल नहीं की जा सकती है।

  • सेट गलत पर वैश्विक, जैसे वैभव गुप्ता ने कहा कि

  • विशिष्ट ajax कॉल में नक्शा स्थानीय करने के लिए अपने वैश्विक संचालकों और $ के माध्यम से वैश्विक घटना को ट्रिगर:

    मेरे सुझाव के लिए होगा .event.trigger विधि

नमूना:

$.ajax({ 
    url: "test.html", 
    global: false, 
    beforeSend: function(){$.event.trigger('ajaxStart');}, 
    complete: function(){$.event.trigger('ajaxStop');}, 
    error: your_error_handler 
}); 
+0

ऐसा लगता है कि यह त्रुटि हैंडलर को रोक सकता है, लेकिन इससे अन्य सूक्ष्म समस्याएं हो सकती हैं। पहले सेड हैंडलर केवल तभी चलाना चाहिए जब पहला अजाक्स अनुरोध शुरू होता है। अगर पहले से ही एक और अजाक्स अनुरोध चल रहा है तो इसे चलाने की जरूरत नहीं है। AJAXStop फ़ंक्शन तब चलता है जब सभी अजाक्स अनुरोध बंद हो जाते हैं। अगर अन्य अजाक्स अनुरोध हैं तो इसे नहीं चलाया जाना चाहिए। अगर मैं कुछ भी बेहतर नहीं देख पाता हूं तो भी मैं आपका जवाब आजमा सकता हूं। –

+0

jQuery के स्रोत के अनुसार (https://github.com/jquery/jquery/blob/master/src/ajax.js#L659-661) jQuery सार्वजनिक उपलब्ध काउंटर jQuery.active का उपयोग कर रहा है। मैंने पुष्टि की कि आप वैश्विक घटना को आग लगाने के लिए इसका उपयोग कर सकते हैं। उदाहरण: पहले भेजें: फ़ंक्शन() {if (jQuery.active === 0) {$ .event.trigger ('AJAXStart')}} – topek

8

आप $.event.global.ajaxError से false पर अस्थायी रूप से वैश्विक त्रुटि कॉलबैक को अमान्य करने के लिए सेट कर सकते हैं। झंडे स्थापित करने के लिए अपने विशेष अनुरोध के error और complete कॉलबैक का उपयोग करें:

$.ajax({ 
    url: 'some.domain.com/', 
}).error(function(jXHR){ 
    // Disable global error logging 
    $.event.global.ajaxError = false; 
}).complete(function(){ 
    // Enable global error logging 
    $.event.global.ajaxError = true; 
}); 

एक उदाहरण jsFiddle पर उपलब्ध है।

प्रस्तुत किया जा रहा है, मैं यह जोड़ना चाहता हूं कि मैं अभी भी जॉन के प्रस्ताव को पसंद करूंगा। इस तकनीक को ध्वज को 2 स्थानों पर सेट करने की आवश्यकता है, जिसमें से आप एक भूल सकते हैं और वैश्विक हैंडलर को गलती से अक्षम कर सकते हैं। दूसरा कारण यह है कि जॉन की तकनीक को jQuery रिलीज़ में काम करने की गारंटी दी जानी चाहिए जहां कुछ आंतरिक झंडे सेट करना विश्वसनीय नहीं है।

संबंधित मुद्दे