2012-06-28 34 views
9

मेरी वेबसाइट के प्रदर्शन/प्रतिक्रिया में सुधार करने के लिए मैंने AJAX, replaceState, pushState, और एक पॉपस्टेट श्रोता का उपयोग करके आंशिक पृष्ठ लोड लागू किया है।आंशिक पृष्ठ लोड के साथ एचटीएमएल 5 इतिहास इतिहास एपीआई बैक बटन

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

यह ज्यादातर ठीक काम करता है, हालांकि मुझे एक विशेष समस्या मिली है जिसे मैं फंस गया हूं। यह समझाने के लिए थोड़ा जटिल है, इसलिए माफ करना अगर यह बहुत स्पष्ट नहीं है।

हमारे अधिकांश पृष्ठों पर एक खोज फ़ॉर्म है। AJAX के माध्यम से आंशिक पृष्ठ लोडिंग केवल GET अनुरोधों पर है, और फ़ॉर्म एक पोस्ट करता है जिसके परिणामस्वरूप पूर्ण पृष्ठ लोड होता है। (पूरे पृष्ठ के माध्यम से

मुख पृष्ठ पर प्रारंभ:

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

जब विकृत होम पेज दिखाई देता है, तो मेरा पॉपस्टेट श्रोता मौजूद नहीं है।

क्या मैं सोचता हूं कि हो रहा है, यह है कि होम पेज का दूसरा लोड (गतिशील, आंशिक) ब्राउज़र द्वारा कैश किया जा रहा है, और फिर जब पूरा पृष्ठ वापस होता है, ब्राउज़र केवल कैश आंशिक दिखा रहा है पूर्ण पृष्ठ की बजाय प्रतिक्रिया।

इसे हल करने का प्रयास करने के लिए मैंने एक वैरी जोड़ा है: ब्राउज़र को यह जानने के लिए हेडर स्वीकार करें कि सामग्री स्वीकृति हेडर के आधार पर बदल सकती है। मैंने कैश-कंट्रोल अधिकतम-आयु = 0, प्रगमा नो-कैश और आंशिक लोड की गई सामग्री को पिछली समाप्ति तिथि भी जोड़ा है ताकि ब्राउजर को इसे कैश न करने के लिए मजबूर किया जा सके, लेकिन इनमें से कोई भी इसे हल नहीं करता है।

दुर्भाग्यवश मेरी कंपनी बाहरी देवता को हमारे देव सर्वरों की अनुमति नहीं देती है, इसलिए मैं आपको समस्या नहीं दिखा सकता। मैंने यहां पर कई समान प्रश्नों को देखा है, लेकिन उनमें से कोई भी काफी समान नहीं लगता है, न ही सुझाए गए समाधान काम करने लगते हैं।

यदि मैं अपने गतिशील जीईटी अनुरोधों के लिए एक बिंदु रहित पैरामीटर (blah = blah) जोड़ता हूं, तो यह समस्या हल करता है। हालांकि यह एक बदसूरत हैक है कि मैं नहीं करना चाहूंगा। ऐसा लगता है कि यह हेडर के साथ हल करने योग्य होना चाहिए, क्योंकि मुझे लगता है कि यह एक कैशिंग समस्या है। क्या कोई बता सकता है कि क्या हो रहा है?

+0

त्वरित अपडेट - हेडर फ़ायरफ़ॉक्स पर समस्या को हल करने लगते हैं, हालांकि यह क्रोम और आईओएस सफारी (वेबकिट मुद्दा शायद?) पर रहता है –

+0

यह कैशिंग समस्या की तरह लगता है। गतिशील जीईटी अनुरोधों में पैरामीटर जोड़ना उचित लगता है - यही jquery-pjax करता है। –

उत्तर

8

यह एक कैशिंग समस्या है। प्रतिक्रिया शीर्षलेख कैश-कंट्रोल के साथ no-cache या max-age=0 पर सेट किया गया है, समस्या एफएफ में नहीं होती है (जैसा कि आपने कहा था), लेकिन यह क्रोम में बनी हुई है।

मेरे लिए काम करने वाला हेडर कैश-कंट्रोल: no-store है। यह सभी ब्राउज़रों द्वारा लगातार लागू नहीं किया जाता है (आप प्रश्न पूछ सकते हैं कि नो-कैश और नो-स्टोर के बीच क्या अंतर है), लेकिन परिणामस्वरूप आप क्रोम में भी अपेक्षा करते हैं।

1

मुझे एक समान समस्या थी। मैं एक वेब-आधारित विज़ार्ड बना रहा हूं और प्रत्येक चरण को लोड करने के लिए jquery AJAX का उपयोग कर रहा हूं (बैक एंड पर एएसपी.नेट एमवीसी)।

आंतरिक मार्ग कुछ/प्रश्न/शो जैसा है - जो पूरे पृष्ठ को लोड करता है और पहला प्रश्न (प्रश्न 0) प्रदर्शित करता है। जब उपयोगकर्ता अगली छवि पर क्लिक करता है, तो यह यूआरएल/प्रश्न/सहेजें/0 के साथ एक jquery .load() करता है। यह उत्तर बचाता है और अगले प्रश्न के साथ आंशिक दृश्य देता है। अगली सहेज एक jquery .load() के साथ/प्रश्न/सहेजें/1 ...

मैंने इतिहास.जेएस लागू किया ताकि उपयोगकर्ता वापस जा सकें और आगे (आगे?) कर सकें। यह राज्य डेटा में प्रश्न संख्या संग्रहीत करता है। जब यह एक राज्य विनिमय का पता लगाता है (और राज्य का प्रश्न संख्या पृष्ठ पर क्या है उससे भिन्न है), यह सही प्रश्न लोड करने के लिए एक jquery .load() करता है।

सबसे पहले मैं उसी मार्ग का उपयोग कर रहा था जब प्रारंभिक पृष्ठ लोड होता है (/ प्रश्न/शो/एक्स जहां एक्स प्रश्न संख्या है)। पिछली छोर पर मैंने पाया कि यह एक अजाक्स अनुरोध था, और यदि पूर्ण दृश्य के बजाय आंशिक दृश्य लौटाया गया। यह वह जगह है जहां यह मुद्दा आपके जैसा ही आया था: कहें कि मैं प्रश्न 3 पर था, वापस चला गया, फिर आगे बढ़ गया, फिर www.google.com पर गया, और फिर बैक बटन दबाएं। यह प्रश्न 3 दिखाता है लेकिन यह आंशिक दृश्य था - क्योंकि ब्राउजर ने उस मार्ग के लिए आंशिक कैश किया था।

मेरा समाधान AJAX कॉल के लिए एक अलग मार्ग बनाना था:/प्रश्न/लोड/एक्स (यह पिछली छोर पर सामान्य कोड का उपयोग करता था)। अब दो अलग-अलग मार्गों के साथ (/ प्रश्न/गैर-AJAX के लिए दिखाएँ और/प्रश्न/AJAX के लिए लोड), ब्राउज़र उपरोक्त स्थिति में पूर्ण पृष्ठ को सही ढंग से दिखाता है।

तो शायद एक समान समाधान आपके लिए काम करेगा ... यानी आपके होम पेज के लिए दो अलग-अलग मार्ग - एक पूर्ण पृष्ठ के लिए और एक आंशिक के लिए। उम्मीद है की वो मदद करदे।

0

जब लिंक पर क्लिक होने मैं सर्वर (एक अलग से इन अनुरोधों की पहचान हैडर स्वीकार करें) और जावास्क्रिप्ट के साथ बदलने से पेज का सिर्फ केंद्रीय सा अनुरोध करते हैं।

बहुत बढ़िया। यह करने का यह सही तरीका है। लेकिन इसे काम करने के लिए एक चीज बाकी है: प्रतिक्रिया के लिए Vary शीर्षलेख जोड़ें।

Vary: Accept 

ब्राउज़र को बताता है कि एक अलग स्वीकृति शीर्षलेख के साथ अनुरोध एक अलग प्रतिक्रिया प्राप्त कर सकता है। चूंकि दो अनुरोध अलग-अलग स्वीकार्य हेडर का उपयोग करते हैं, इसलिए ब्राउज़र (और कोई भी कैशिंग प्रॉक्सी) अलग-अलग प्रतिक्रियाओं को कैश करेगा।

Cache-Control: no-store सेटिंग के विपरीत, यह आपको अभी भी कैशिंग का उपयोग करने की अनुमति देगा।

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

  • कोई संबंधित समस्या नहीं^_^