2011-08-31 10 views
14

मैं सभी AJAX अनुरोधों के लिए एक वैश्विक ईवेंट हैंडलर पंजीकृत करना चाहता हूं, ताकि मैं से से पहले ईवेंट ईवेंट को रोक और संभाल सकूं, विशिष्ट ईवेंट हैंडलर उन्हें प्राप्त करता है।ईवेंट हैंडलर से पहले मैं jQuery में AJAX प्रतिक्रियाओं को कैसे रोक सकता हूं?

उदाहरण के लिए, मेरे कोड की तरह कुछ हो सकता है:

$("#placeholder").load("/fragments/userpics"); 

और मैं एक "पहले" ईवेंट हैंडलर रजिस्टर करने के लिए इतना है कि मैं कर सकता है, उदाहरण के लिए, एक लॉगिन बक्से अगर एक 401 प्रतिक्रिया प्रदर्शित करना चाहते हैं वापस आ गया है, या शायद 503 प्रतिक्रिया होने पर पुनः प्रयास करें।

मैंने सोचा था कि $.ajaxError() है कि जहां मैं कुछ इस तरह करना होगा, लेकिन जाहिरा तौर पर यह ईवेंट हैंडलर के बाद ही शुरू हो रहा है।

अद्यतन: ठीक है, यहाँ है कि मैं क्या @genesis की मदद से अब तक मिला है, है:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    var success = options.success; 
    options.success = function(data, textStatus, jqXHR) { 
     // override success handling 
     if(typeof(success) === "function") return success(data, textStatus, jqXHR); 
    }; 
    var error = options.error; 
    options.error = function(jqXHR, textStatus, errorThrown) { 
     // override error handling 
     if(typeof(error) === "function") return error(jqXHR, textStatus, errorThrown); 
    }; 
}); 

कुछ परीक्षण करने के बाद, ऐसा लगता है कि मैं भी options.complete ओवरराइड करने के लिए की आवश्यकता होगी लग रहा है।

हालांकि, यह अभी भी सभी अड्डों को कवर नहीं करता है, क्योंकि आप सीधे jqXHR ऑब्जेक्ट पर ईवेंट संलग्न कर सकते हैं और options बदलकर इस मामले में सहायता नहीं करेंगे।

कोई सुझाव?

+0

http://stackoverflow.com/a/10796951/1509853? – oCcSking

उत्तर

5

कस्टम अनुरोध अजाक्स विकल्प हैंडल करें या प्रत्येक अनुरोध भेजे जाने से पहले मौजूदा विकल्पों को संशोधित करें और इससे पहले कि वे $ .ajax() द्वारा संसाधित हो जाएं।

http://api.jquery.com/jQuery.ajaxPrefilter/

मुझे यकीन है यह भी .load() के लिए काम करता

+0

मैं मूल प्रश्न या jQuery दस्तावेज़ों को गलत तरीके से पढ़ रहा हूं, लेकिन ऐसा लगता है कि अनुरोध से पहले 'AJAXPrefilter' हस्तक्षेप करने जा रहा है ** ** अनुरोध भेजा गया है और @itsadok ** ** के बाद ** हस्तक्षेप करना चाहता है भेजा गया और प्रतिक्रिया प्राप्त हुई लेकिन इसे संसाधित होने से पहले। –

+0

@ रिक, चाल विकल्प.success और options.error को ओवरराइड करना है। हालांकि, मैं अभी भी इसे काम कर रहा हूं। – itsadok

+0

@itsadok, 'AJAXComplete() 'इसे पकड़ने के लिए बेहतर जगह नहीं होगी? या वह चक्र में बहुत देर हो चुकी है? मैं स्वीकार करूंगा कि jQuery मेरा मजबूत सूट नहीं है ... –

17

आप डेटा ईवेंट हैंडलर से पहले सर्वर से वापस आ रहा संभालने के लिए चाहते हैं, datafilter का उपयोग करें:

jQuery.ajaxSetup({ 
     dataFilter: function (data, type) { 
      //modify the data 

      return data; 
     } 
    }); 
+1

jQuery, jquery नहीं – Yegor

0

ह्यूगो फोर्ट के पास सही जवाब है, किसी भी ईवेंट हैंडलर को डेटाफिल्टर का उपयोग करने से पहले अजाक्स प्रतिक्रिया को रोकने का एकमात्र तरीका है।

मुझे कोड का पुन: संसाधित किए बिना क्लाइंट पक्ष पर अजाक्स प्रतिक्रियाओं को पुनर्निर्देशित करने के लिए आज इसका उपयोग करना पड़ा।

$.ajaxSetup({ 
    dataFilter: function (data, type) { 
     if (data !== "" && data === "NOAUTH") { 
      window.location = '/'; 
     } 
     return data; 
    } 
}); 
संबंधित मुद्दे