2009-08-05 13 views
9

मैं jQuery कैश पर jQuery में AJAX कॉल से लौटाए गए JSON डेटा को पकड़ने का प्रयास कर रहा हूं।ब्राउज़र पहले से ही अपने कैश का उपयोग पहले AJAX कॉल से नहीं कर सकता?

सामान्य ब्राउज़र गतिविधि ब्राउज़र कैश पर हर समय निर्भर करती है। उदाहरण: jpg और gif छवियों को पृष्ठ रीलोड पर रीफ्रेट नहीं किया गया है।

लेकिन जब मैं jQuery getJSON AJAX कॉल का उपयोग करने का प्रयास करता हूं, तो मैं सर्वर से डेटा लाने से बचने के लिए प्रतीत नहीं कर सकता।

मेरे वापस आए हेडर (फ़ायरबग के साथ पुष्टि की) इस तरह दिखेगा:

Transfer-Encoding: chunked 
Date: Wed, 05 Aug 2009 02:55:39 GMT 
Content-Type: text/plain; charset=ISO-8859-1 
Expires: Wed, 05 Aug 2009 03:55:39 GMT 
Cache-Control: max-age=3600 

फिर भी पेज के लिए एक तत्काल ताज़ा सर्वर हिट करने के लिए समान अनुरोधों का कारण बनता है।

मैंने कैशिंग व्यवहार से परहेज करने के बारे में कई पोस्टिंग देखी हैं, जो मुझे चाहिए। मैंने कैशिंग का उपयोग करने के बारे में कई पोस्टिंग देखी हैं, लेकिन उन सभी को DOM में डेटा सहेजने पर पर भरोसा है। मुझे ऐसा कुछ चाहिए जो एक पृष्ठ रीलोड के दौरान कैश की गई छवियों की तरह व्यवहार करता हो।

ब्राउज़र को बस इसे अपने स्वयं के कैश से लाएं?

--x - एक्स - एक्स - एक्स अद्यतन --x - एक्स - एक्स-

मेरी निराशा करने के लिए बहुत, कई सम्मानजनक लोगों का मानना ​​है कि यह सिर्फ संभव नहीं है। कुछ लोग यह भी तर्क देते हैं कि यह नहीं होना चाहिए (जो अभी भी मुझे परेशान करता है)।

Stubburn एक गलती करने के लिए, मैं निम्नलिखित की कोशिश की:

मैं बाहर जाने वाले सभी पृष्ठों मैं कैश हो जाने की (मैं कुछ पसंद यूआरएल तर्क है कि डेटा मैं का अनुरोध कर रहा हूँ प्रतिनिधित्व लेने चाहते हैं पर ETag शीर्षलेख सेट और बस इटाग वैल्यू के लिए इसका इस्तेमाल करें)

अगले अनुरोध की शुरुआत में, मैं बस जांचता हूं कि 'अगर-नो-मैच' हेडर अनुरोध में है या नहीं। यदि ऐसा है, तो ब्राउज़र अनुरोध जैसा कैश नहीं कर रहा है, इसलिए मैंने 304 संशोधित प्रतिक्रिया भेजी नहीं।

परीक्षण से पता चलता है कि फ़ायरफ़ॉक्स मेरे अनुरोध कैश नहीं होगा (लेकिन मैं अभी भी बच सकते हैं मेरी cgi का हिस्सा 'महंगा डेटा लाने'), जबकि IE6 वास्तव में यह (कैश होगा और अभ्यस्त भी से वापस प्राप्त करने में कठिनाई का प्रयास सर्वर)।

यह एक सुंदर जवाब नहीं है, लेकिन यह अब मेरे लिए काम कर रहा है
(ग्राफ डेटा के उन पेस्टी पूर्ण-पृष्ठ रीफ्रेश अब बहुत धीमे या महंगा नहीं होंगे)।

(क्या? मैं IE6 चल रहा हूँ! OMG! ओह एक गिलहरी देखो!)

+0

शायद मैं उपयोग करने की आवश्यकता यदि संशोधित के बाद से अनुरोध HTTP 304 स्थिति कोड के लिए इन कन्वर्ट करने के लिए? – ericslaw

+0

डर्न, यहां तक ​​कि 'अगर-संशोधित-से-बाद' हेडर को अनुरोध में भेजा जा रहा है ... 304 दृष्टिकोण – ericslaw

+0

के लिए बहुत कुछ मुझे प्रारंभिक अनुरोध पर एटाग सेट करने और 304 लौटने पर कुछ भाग्य था यदि 'अगर-कोई-मैच' शीर्षलेख मौजूद नहीं है बाद में अनुरोध – ericslaw

उत्तर

11

अजाक्स कैशिंग संभव है और अनुमानित (कम से कम आईई और फ़ायरफ़ॉक्स में)।

इस ब्लॉग पोस्ट की चर्चा अजाक्स कैशिंग और एक डेमो वेब पृष्ठ है:

http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/

वहाँ भी है एक F5 मुद्दे पर स्टीव Souders द्वारा पालन करें:

http://stevesouders.com/tests/ajax_caching.php

0

जबकि नहीं "ब्राउज़र कैश" क्या सत्र स्थिति या ग्राहक के पक्ष की बचत का एक अन्य स्वरूप के बारे में। आपकी टिप्पणी में उल्लिखित स्थिति के बाद भी आपको संशोधित होने की आवश्यकता होगी।

ब्राउजर को मूल रूप से पता नहीं चलेगा कि डेटा बदल दिया गया है या नहीं क्योंकि जेसन ने गतिशील रूप से पुनर्प्राप्त किया है और कैश में क्या है स्थिर है। मुझे लगता है?

1

संक्षिप्त उत्तर नहीं है। दुर्भाग्यवश, ब्राउज़र विश्वसनीय रूप से AJAX अनुरोधों को कैश नहीं करते हैं जैसे वे "सामान्य" पृष्ठ करते हैं।(हालांकि डेटा वास्तव में कैश्ड हो सकता है, ब्राउज़र अक्सर का उपयोग करते समय कैश को AJAX अनुरोधों को संभालने के दौरान कैश करते हैं।) यह भविष्य में बदलना चाहिए, लेकिन अभी के लिए आपको इसके आसपास काम करना होगा ।

+1

हाँ। यह सबसे अच्छा असंगत है। कभी-कभी वे करते हैं जब आप कम से कम इसकी अपेक्षा करते हैं। – jason

1

आप यह सुनिश्चित करने के लिए Resource Expert Droid का उपयोग करके अपने संसाधनों की जांच कर सकते हैं कि वे आपके द्वारा किए जाने वाले कार्यों को कर रहे हैं। फायरबग पूरी कहानी नहीं कह रहा है, तो आपको Wireshark जैसे कुछ का उपयोग करके अनुरोध और प्रतिक्रिया शीर्षलेखों को दोबारा जांचने के लिए नेटवर्क ट्रेस भी चलाया जाना चाहिए।

यह संभव है कि jQuery कुछ अनुरोध शीर्षलेखों को इस तरह से शामिल कर सके कि ब्राउज़र का निर्णय कैश को बाईपास करना चाहिए। क्या आपने बिना ढांचे के सादे XMLHTTPRequest की कोशिश की है?

+0

वेबसाइट सार्वजनिक नहीं है, इसलिए रेडबॉट का उपयोग नहीं कर सकते, लेकिन धन्यवाद। वायरशर्क फायरबग शो की तुलना में एक ही शीर्षलेख दिखाता है। मैंने XMLHTTPRequest को सीधे कोशिश नहीं की है (इसके लिए सूचक कैसे है?) – ericslaw

+0

क्लासिक XMLHTTPRequest संदर्भ: http://developer.apple.com/internet/webcontent/xmlhttpreq.html यदि आप वास्तव में उत्सुक हैं, तो आप स्थानीय रूप से रेडबॉट स्थापित कर सकते हैं। – Carey

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