2013-05-08 17 views
41

पर गतिशील रूप से परिवर्तित एचटीएमएल को सुरक्षित रखें यह आश्चर्यजनक है, मैं लगातार यह अन्य साइटों में काम करता हूं लेकिन कभी भी उन साइटों में नहीं जो मैं काम कर रहा हूं।बैक बटन

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

मैं इसे यूआरएल परिवर्तनों के बिना या हैश # के बिना अन्य साइटों में हर समय काम करता हूं।
क्या यह काम करने के लिए कोई चाल है या क्या यह ब्राउज़र द्वारा यादृच्छिक रूप से तय किया गया है?
यदि मैं इस जानकारी के लिए यूआरएल का उपयोग नहीं करना चाहता, तो क्या कोई आसान विकल्प है?

+0

कुकी में पृष्ठ की "स्थिति" को सहेजने के बारे में क्या? उदाहरण के लिए क्लाइंट ने लॉगिन बॉक्स दिखाने के लिए क्लिक किया है, फिर आप उस क्रिया को कुकी में "लॉगिन = 1" में सहेजते हैं, और जब भी ग्राहक वापस आता है, तो आप कुकी पढ़ने और लॉगिन दिखाने के लिए जावास्क्रिप्ट का उपयोग करते हैं। हालांकि मुझे नहीं लगता कि यह "सर्वश्रेष्ठ" समाधान है क्योंकि देखभाल करने के लिए बहुत सारे "विकल्प" हो सकते हैं। – HamZa

+1

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

+0

हो सकता है कि वे पृष्ठ _before_ ऑनलोड बनाएं जो ब्राउज़र होना चाहिए जब ब्राउज़र HTML को कैश करता है। –

उत्तर

40

लगभग डेढ़ साल तक, मैं दो चाल का उपयोग कर रहा हूं जिसे मैंने एक बार दर्दनाक परीक्षण और त्रुटि से खोजा: इनपुट फ़ील्ड मान - विशेष रूप से 'छिपे हुए' - ब्राउज़र के इतिहास में यूआरएल के साथ संरक्षित हैं - और - बैक (या आगे) बटन से पृष्ठ पर लौटने पर ऑनलोड ईवेंट को कॉल किया जाता है।

इसका मतलब है कि आप जितना चाहें उतना 'राज्य' स्टोर कर सकते हैं - छुपे हुए फ़ील्ड में (उन्हें एक रूप में रखना याद रखें), और फिर 'ऑनलोड' पर परिवर्तनों को फिर से करें। मैं आमतौर पर 'रेंडर' भाग को एक अलग फ़ंक्शन बना देता हूं ... दूसरे शब्दों में, जब गतिशीलता हो रही है, तो मैं पहले छिपे हुए फ़ील्ड को लिखता हूं - फिर रेंडर फ़ंक्शन को कॉल करें। फिर मैं गतिशीलता के विभिन्न बिट्स के लिए सभी विभिन्न प्रस्तुत कार्यों को एक साथ इकट्ठा करता हूं और उन्हें ऑनलोड से कॉल करता हूं।

मुझे लगता है कि मैंने कभी भी किसी भी मैनुअल में इसका शिकार नहीं किया है - इसलिए कोई आश्वासन नहीं दे सकता - लेकिन मैं इसे अच्छी तरह से उपयोग कर रहा हूं (नेटस्केप !!! के बाद से) यह 'कई' ब्राउज़र के साथ काम करता है (सभी आईईएस, क्रोम, एफएफ - लेकिन दूसरों के लिए, मैंने कभी कोशिश नहीं की है।)

यदि किसी के पास 'सही' और कम कठिन तरीका है, तो मैं बहुत खुश हूं इसके बारे में सुनें। लेकिन ऐसा लगता है कि चाल चल रही है।

+1

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

+0

आप और मैं भी ... :) मुझे आश्चर्य है कि कैसे/यदि तकनीक आप के बाद हैं, एफएफ के अलावा अन्य ब्राउज़रों के साथ काम करता है। मैं अक्सर सरकारी एजेंसियों के लिए काम करता हूं - जिन्हें अक्सर पुराने आईई ब्राउज़र के लिए मानकीकृत किया जाता है - कुछ अभी भी आईई 6 पर हैं (हालांकि दुर्लभ होने लगते हैं) - लेकिन आईई 7 थोड़ी देर के आसपास होगा ... वैसे भी, मैं बहुत रुचि के साथ देख रहा हूं । सवाल उठाने के लिए धन्यवाद। – Groover

+1

आपके उत्तर को दोबारा पढ़ने पर, मैं आगे ध्यान दूंगा कि जिस तकनीक का मैंने वर्णन किया है उसे पृष्ठ को 'पुनः लोड' करने के लिए वास्तविक सर्वर यात्रा की आवश्यकता नहीं है - या इसके किसी भी भाग - या यूआरएल को संशोधित करना - प्रभाव यह है कि जब आप दबाते हैं पृष्ठ पर वापस जाने के लिए बैक बटन, सभी गतिशील परिवर्तन जादूगर रूप से पहली बार पृष्ठ देखते हैं - चाहे पहले स्थान पर AJAX द्वारा रखा गया हो - या बस, आंकड़ों के एक स्तंभ को संक्षेप में कहें। मुझे क्षमा करें अगर यह पहले से ही समझा गया था। :) – Groover

0

मुझे लगता है कि कारण यह हो सकता है कि अन्य वेबपृष्ठ कुछ बैक-एंड सर्वर का उपयोग करते हैं जो सत्र प्रदान करते हैं।

यदि आप स्थिर एचटीएमएल/जेएस पेज बना रहे हैं तो ऐसा कोई सत्र और पृष्ठ बस पुनः लोड नहीं होता है।

आप जो भी चाहते हैं उसे प्राप्त करने के लिए कुकीज़ का उपयोग कर सकते हैं।

+0

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

1

आप इस तरह History.js का उपयोग कर अपने लक्ष्य को प्राप्त कर सकते हैं:

function manageHistory(data){ 

    var History = window.History; 
    if (!History.enabled) { return false; }   
    History.replaceState({myData: data}, null); 
} 

$('select.select').change(function(e) { // I am using select tag here to give an example of an HTML action triggerer 

    e.preventDefault(); 

    // get data from your select tag 

    manageHistory(data) 


}); 

History.Adapter.bind(window, 'statechange', function() { 
    var State = History.getState(); 

    // Launch the ajax call and update DOM using State.data.myData 
}); 

इतिहास के बारे में दस्तावेज़ अनुसार मोज़िला साइट पर, pushstate तीसरे पैरामीटर है:

URL — ....... This parameter is optional; if it isn't specified, it's set to the document's current URL.

+0

धन्यवाद, मुझे पता है कि यह कैसे करना है, मैंने इसे इतिहास.जेएस प्लगइन के साथ किया है, लेकिन सभी यह AJAX कॉल के समय पृष्ठ स्क्रॉल स्थिति को सहेजता है। मैंने pushState और replaceState को आजमाया है।दोनों मामलों में जब मैं बैक बटन – Madd0g

9

यहाँ आरईएस के लेखक, पाया आपका प्रश्न/आर/जावास्क्रिप्ट

जाहिर है, फ़ायरफ़ॉक्स ने हाल ही में इसे स्वयं करने के लिए कार्यक्षमता जोड़ा है, लेकिन ऐसा करने के लिए कोई "अच्छा" तरीका नहीं है जब ब्राउज़र नहीं करता तुम्हारे लिए।

क्या आरईएस करने के लिए उपयोग किया जाता है एक # पृष्ठ = एन मार्कर जोड़ें जहां एन आपका पृष्ठ नंबर था। इस तरह, पेजेलोड पर, आरईएस जानता है कि यदि पहले से ही कोई स्थान है तो बैक बटन से आना चाहिए। दुर्भाग्यवश, इस विशेष व्यवहार ने ctrl-f को फ़ायरफ़ॉक्स और क्रोम में खोजा जब एक खोज ने आपको स्क्रॉल किया एक और पृष्ठ (पृष्ठ = एन + 1), क्योंकि एक हैशचेंज खोज संवाद को बंद कर देगा जो उपयोगकर्ताओं को नाराज करता है ...

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

हालांकि: हाल ही में मैंने एफएफ और क्रोम में परीक्षण किया और ऐसा लगता है कि हैश परिवर्तन अब ctrl-f खोज संवाद को "रद्द" नहीं करते हैं, इसलिए मेरा सुझाव यह होगा कि आप इसका उपयोग करेंगे। पगेलोड पर, यदि कोई हैश मौजूद है, तो उस हैश द्वारा निर्धारित प्रासंगिक डेटा लोड करें।

आप, क्या तुम सच में पागल हो जाना चाहते हैं, localStorage में वास्तविक HTML सामग्री को संग्रहीत और वापस बटन के माध्यम से pageload पर यह फिर से लोड के रूप में अच्छी तरह से कर सकते हैं। यह चीजों को करने का सबसे प्रभावी तरीका नहीं हो सकता है, और लगभग निश्चित रूप से जावास्क्रिप्ट के साथ संघर्ष का कारण बनता है जो डोम पर निर्भर करता है, हालांकि, सावधानी के साथ चलना!

"सर्वश्रेष्ठ" समाधान वास्तव में वास्तव में क्या आपकी साइट कर रही है/क्या है कि सामग्री/की तरह बर्ताव करता लग रहा है पर निर्भर करता है।

+0

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

+0

मेरी इच्छा है कि ब्राउज़र के लिए ऐसा नहीं करने पर ऐसा करने के लिए "कोई नहीं है" अच्छा "तरीका" के अलावा मेरे लिए बेहतर जवाब था। "मुझे लगता है कि मैं कभी नहीं पता कि यह क्यों काम करता है reddit और मेरी साइटों पर नहीं। वैसे भी – Madd0g

+0

जहां तक ​​मैं इसे समझता हूं, केवल एफएफ रेडडिट पर एनईआर के राज्य को बचाएगा। क्या आप कह रहे हैं कि आप क्रोम को भी सहेजते हैं? – honestbleeps

-1

मैं आपको कुकीज़ का उपयोग करने की सलाह दूंगा।

हालांकि HTML5 Webstorage प्रदान करता है, इसके साथ ही यह मान ब्राउज़र में संग्रहीत किया जा सकता है। एचटीएमएल 5 वेबस्टॉरेज को संभालने वाले कुछ जेएस लिब भी हैं।

नोट: प्रत्येक ब्राउजर स्टोर किए जा सकने वाले डेटा के आकार के बीच अंतर हैं। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं here

टिप्पणी 2: वहाँ भी उपयोगकर्ता डिस्क स्थान हैकिंग के साथ कुछ मुद्दों थे, तो आप उम्मीद कर सकते हैं कि का उपयोग कर WebStorage अद्यतन किया जाएगा के बारे में नीतियों (http://feross.org/fill-disk/)

0

स्थानीय संग्रहण एक ही रास्ता है, एक और तरीका है है सर्वर साइड हठ। ।

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

जब आप पृष्ठ पर लौटने - ... आप सर्वर साइड हठ उपयोग कर रहे हैं पेज स्थानीय भंडारण से संग्रहीत जानकारी प्राप्त कर सकते हैं, आप एक सत्र कुकी के साथ इसका इस्तेमाल करने के लिए उपयोगकर्ता की पुनः प्राप्त करने की आवश्यकता होगी राज्य परिवर्तन - जिसे सर्वर से लोड किया जा सकता है।

+0

यह कम से कम क्रोम में काम नहीं करता है। ऐसा लगता है कि ब्राउजर भी अजाक्स को कैश करता है, भले ही कैशिंग हेडर को कैश पर सेट न किया जाए। – Roey

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