2010-06-02 20 views
8

मुझे आश्चर्य है कि किसी विशेष AJAX विधि से कैश को साफ़ करना संभव है या नहीं।क्या आप jquery AJAX कैश साफ़ कर सकते हैं?

$.ajax({ 
    url: "test.html", 
    cache: true, 
    success: function(html){ 
    $("#results").append(html); 
    } 
}); 

अब समय के 99%, एक कैश्ड परिणाम के बाद से यह हमेशा एक ही सामग्री होनी चाहिए इस्तेमाल किया जा सकता:

मैं इस राशि कहो। हालांकि, यदि कोई उपयोगकर्ता इस सामग्री को अपडेट करता है, तो यह (निश्चित रूप से) बदलता है। यदि यह कैश किया गया है, तो यह अभी भी पुरानी सामग्री दिखाएगा।

तो, यह अच्छा होगा अगर मैं इस विधि के लिए इस कैश को चुन सकता हूं और इसे साफ़ कर सकता हूं और अन्य सभी कैश किए गए सामान रहेंगे।

क्या यह किया जा सकता है?

संपादित

मैं पालन नहीं करते। मैं देखता हूं कि यदि आप cache को झूठी पर सेट करते हैं, तो यह ब्राउज़र को कैशिंग करने से रोकने के लिए एक अद्वितीय यूआरएल बनाता है।

मेरी समस्या यह है कि मैं इसे तब तक कैश करना चाहता हूं जब तक कि कोई इसे अद्यतन न करे। तब तक इसे तब तक कैश नहीं किया जाना चाहिए जब तक वे उस पर क्लिक न करें। फिर इसे फिर से कैश किया जाना चाहिए।

असल में, मेरे पास एक अद्यतन मॉडल संवाद (jquery UI) है जो एक अद्यतन फ़ॉर्म लाता है ताकि उपयोगकर्ता टेबल पंक्ति अपडेट कर सकें। जब वे "अपडेट करें" पर क्लिक करते हैं, तो यह उस तालिका पंक्ति को अपडेट करता है। अब एक कॉलम डेटा के लायक कुछ अनुच्छेदों की तरह हो सकता है और यह तालिका खराब दिखता है।

इसलिए तालिका को संरक्षित करने के लिए, मेरे पास "डेटा दिखाएं" नामक एक लिंक है। अब, जब इसे क्लिक किया जाता है, तो एक संवाद मॉडल बॉक्स दिखाता है और डेटा सर्वर से खींचा जाता है।

अगर वे इसे 5 बार क्लिक करते हैं तो इसे 5 बार पुनः लोड किया जाता है। यही कारण है कि मैं इसे कैश करना चाहता हूं। हालांकि, अगर वे उस पर क्लिक करते हैं और यह कैश हो जाता है तो किसी भी कारण से वे उस पंक्ति को अपडेट करते हैं और अपडेट करते हैं और "डेटा दिखाएं" पर क्लिक करते हैं, उन्हें कैश संस्करण मिलेगा, न कि अद्यतन संस्करण।

मैं शायद सभी अनुच्छेदों को छुपा सकता हूं और उन्हें jquery का उपयोग करके इच्छानुसार दिखा सकता हूं लेकिन मुझे इसकी मांग पर जाना होगा। अन्यथा वहां बहुत ज्यादा बकवास छिपा होगा और यह पृष्ठ को धीमा कर देगा (कल्पना करें कि क्या किसी व्यक्ति के पास 50 पंक्तियां हैं और उनमें से प्रत्येक कॉलम में 1000 वर्ण हैं)।

उत्तर

10

आप $.ajax के डिफ़ॉल्ट cache: true पैरामीटर को गलत समझा रहे हैं। प्रलेखन में, आपको निम्न मिलेगा:

झूठी यह पृष्ठों को आप जा ब्राउज़र द्वारा कैश नहीं करने के लिए अनुरोध है कि बाध्य करेगा करने के लिए सेट करते हैं।

को समझने के लिए क्या इस पैरामीटर वास्तव में करता है, आप jQuery स्रोत कोड पर गौर करना चाहिए:

if (s.cache === false && type === "GET") { 
    var ts = now(); 

    // try replacing _= if it is there 
    var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 

    // if nothing was replaced, add timestamp to the end 
    s.url = ret + ((ret === s.url) ? 
      (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); 
} 

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

प्रश्न के संपादित भाग के आधार पर अद्यतन: यदि मैं आपको सही ढंग से समझता हूं, तो आप स्थानीय ब्राउज़र कैश का उपयोग करना चाहते हैं, लेकिन आप इसे नियंत्रित करना चाहते हैं। यदि ऐसा है, तो आपको cache: true के डिफ़ॉल्ट मान का उपयोग करना चाहिए ($.ajax में यह पैरामीटर जोड़ें)। $.ajax() विकल्प के आधार पर, आपको अपनी सर्वर प्रतिक्रिया में कुछ अतिरिक्त कैशिंग जानकारी जोड़नी चाहिए। ब्राउजर हमेशा स्पष्ट रूप से कैशिंग निर्देशों का पालन करेंगे क्योंकि वे इसी पृष्ठ शीर्षलेख में लिखे गए हैं।

तो, उदाहरण के लिए, आप या तो प्रतिक्रिया शीर्षलेख में एक समय जोड़ सकते हैं जो निर्दिष्ट करता है कि पृष्ठ कब मान्य है। यदि आपको क्लाइंट पर डेटा के पूर्ण नवीनतम संस्करण की आवश्यकता नहीं है तो यह बहुत प्रभावी है (http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html देखें)।

एक और तरीका है, जो मैं अपने अनुप्रयोगों के अधिकांश में उपयोग करते हैं, सर्वर प्रतिक्रिया हेडर

  1. "कैश-नियंत्रण" "अधिकतम उम्र = 0" सेट है, जो स्विच बंद करने के लिए निम्न जोड़ने के लिए है स्थानीय कैशिंग
  2. डेटा के बारे में पहचानने के लिए कुछ मूल्य (उदाहरण के लिए, भेजा गया डेटा का MD5 हैश) के साथ "Etag"। मान बिल्कुल मुफ्त है, आप इसे किसी भी तरह से गणना कर सकते हैं, लेकिन दो अलग-अलग प्रतिक्रियाओं में अलग-अलग "Etag" मान होना चाहिए।

यह विधि गतिशील सामग्री के लिए बहुत अच्छी है (उदाहरण के लिए, डेटाबेस से डेटा के आधार पर प्रतिक्रिया के लिए) यदि आप हमेशा डेटा का नवीनतम संस्करण रखना चाहते हैं, लेकिन सर्वर नहीं चाहते हैं पिछली प्रतिक्रिया के बाद से यह नहीं बदला है कि डेटा फिर से भेजें। यदि आप इस विधि का पालन करते हैं, तो ब्राउज़र (प्रत्येक ब्राउज़र) "If-None-Match" HTTP अनुरोध शीर्षलेख के अंदर स्थानीय कैश किए गए पेज से "एटैग" मान "डेटा दिखाएं" बटन पर दूसरे क्लिक पर सर्वर पर भेजने वाले डेटा के शीर्षलेख में जोड़ें। फिर सर्वर परिभाषित कर सकता है कि डेटा बदल गया है या नहीं। यदि नहीं, तो सर्वर खाली प्रतिक्रिया और "304 Not Modified""200 OK" के बजाय प्रतिक्रिया दे सकता है। ब्राउज़र यह जानता है और यह सीधे स्थानीय नकद से डेटा प्राप्त करता है। तो आपका $.ajax अनुरोध सफल हो जाएगा और आपके पास स्थानीय नकद से डेटा होगा।

आप कारणों से दो तरीकों को जोड़ सकते हैं। बस "अधिकतम आयु = 0" कुछ गैर शून्य मान के बजाय सेट करें जो स्थानीय नकदी की वैधता के सेकंड में समय है (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3 देखें)

+0

संपादित करें ....... – chobo2

+0

क्षमा करें, मैं नहीं करता हूं ' समझ में नहीं आता कि "संपादित करें ......." के साथ आपका क्या मतलब है। – Oleg

+0

मैंने अभी अपनी पोस्ट संपादित की है। क्षमा करें उम्मीद से अधिक कुछ मिनट लंबा लिया। – chobo2

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