एचटीएमएल 5 इतिहास एपीआई (पुशस्टेट?) [बंद] का उपयोग करने के लिए अच्छा ट्यूटोरियल


168

मैं AJAX लोड की गई सामग्री के साथ गहरी लिंकिंग समस्याओं को हल करने के लिए HTML5 हिस्ट्री एपीआई का उपयोग कर रहा हूं, लेकिन मैं मैदान से हटने के लिए संघर्ष कर रहा हूं। क्या किसी को भी किसी भी अच्छे संसाधनों का पता है?

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

मेरा प्रारंभिक शोध जेएस के भीतर एक इतिहास एपीआई और पुशस्टैट पद्धति की ओर इशारा करता है।

http://html5demos.com/history

जवाबों:


181

एक महान ट्यूटोरियल के लिए इस कार्यक्षमता पर मोज़िला डेवलपर नेटवर्क पेज आपको बस आवश्यकता होगी: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history

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

आप History.js के बारे में और अधिक यहाँ पढ़ सकते हैं: https://github.com/browserstate/history.js

Hashbangs VS Hashes VS HTML5 History API के बारे में एक लेख के लिए, यहां देखें: https://github.com/browserstate/history.js/wiki/Intelligent-State-Handling


25
बेशर्म स्व-प्लग। हालांकि उत्कृष्ट पोस्ट और प्लगइन। :)
पुरग

33

मुझे 'डाइव इन HTML 5' से बहुत फायदा हुआ। स्पष्टीकरण और डेमो आसान और बात है। इतिहास का अध्याय - http://diveintohtml5.info/history.html और इतिहास डेमो - http://diveintohtml5.info/examples/history/fer.html


1
वास्तव में बहुत बढ़िया ट्यूटोरियल। इस बीच URL diveintohtml5.info बन गया ; उत्तर को अपडेट करना चाह सकते हैं।
बजे डैन डस्केल्सस्कु

28

एचटीएमएल 5 पुशस्टेट का उपयोग करते समय ध्यान रखें कि यदि कोई उपयोगकर्ता किसी गहरे लिंक को कॉपी या बुकमार्क करता है और उसे फिर से विजिट करता है, तो वह एक सीधा सर्वर हिट होगा जो 404 होगा, इसलिए आपको इसके लिए तैयार होने की जरूरत है और यहां तक ​​कि एक पुश जेएस लाइब्रेरी भी मदद नहीं करेगी। आप। सबसे आसान उपाय यह है कि अपने Nginx या Apache सर्वर पर एक पुनर्लेखन नियम जोड़ें:

अपाचे (यदि आप एक का उपयोग कर रहे हैं तो आपके vhost में):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
 </IfModule>

nginx

rewrite ^(.+)$ /index.html last;

यह असली जवाब है। यह कहीं भी बालूप्टन के इतिहास.जे. विकी / ट्यूटोरियल आदि पर नहीं है। वास्तव में, हिस्ट्री। जेएस हैश का उपयोग नहीं करते हैं इसलिए आपको एक .htaccess पुनर्निर्देशन का उपयोग करने की आवश्यकता है!
adriendenat

13
आदर्श रूप से आपके सर्वर / ऐप को इस पुनर्लेखन की आवश्यकता के बिना उचित रूप से मार्ग का जवाब देना चाहिए।
शोल्सिंगर

कई आधुनिक जावास्क्रिप्ट चौखटे जैसे कि Backbone.js, स्पाइन, एम्बर, आदि को छोड़कर, ये सभी अनिवार्य रूप से "एक पृष्ठ" जावास्क्रिप्ट अनुप्रयोग हैं। कोई SEO, ect के लिए बैकएंड टेम्प्लेट की सेवा का एक समाधान निकाल सकता है, लेकिन इस बीच यह आवश्यक होगा।
मौविस लेडफोर्ड

*सही। : मैं यहाँ और अधिक विस्तार में इस बारे में लिखने readystate4.com/2012/05/17/...
Mauvis Ledford

6

एचटीएमएल 5 इतिहास कल्पना विचित्र है।

history.pushState()किसी popstateईवेंट को प्रेषण नहीं करता या अपने आप नया पृष्ठ लोड नहीं करता । यह केवल इतिहास में राज्य को आगे बढ़ाने के लिए था। यह एकल पृष्ठ अनुप्रयोगों के लिए "पूर्ववत करें" सुविधा है। आपको एक popstateघटना को मैन्युअल रूप से भेजना होगा या history.go()नए राज्य में नेविगेट करने के लिए उपयोग करना होगा। विचार यह है कि एक राउटर popstateघटनाओं को सुन सकता है और आपके लिए नेविगेशन कर सकता है।

ध्यान देने योग्य कुछ बातें:

  • history.pushState()और घटनाओं को history.replaceState()नहीं भेजना popstate
  • history.back(), history.forward()और ब्राउज़र के पीछे और आगे के बटन popstateघटनाओं को भेजते हैं।
  • history.go()और history.go(0)एक पूर्ण पृष्ठ पुनः लोड करें और popstateघटनाओं को न भेजें ।
  • history.go(-1)(बैक 1 पेज) और history.go(1)(फॉरवर्ड 1 पेज) popstateईवेंट डिस्पैच करते हैं।

आप एक नए राज्य को धक्का देने के लिए इस तरह से इतिहास एपीआई का उपयोग कर सकते हैं और एक पॉपस्टेट घटना को भेज सकते हैं।

history.pushState({message:'New State!'}, 'New Title', '/link'); window.dispatchEvent(new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: history.state }));

फिर popstateएक राउटर के साथ घटनाओं के लिए सुनो ।


1
यह सिर्फ मुझे है, या new PopStateEvent(...)IE11 में काम नहीं करने लगता है? क्या कोई वर्कअराउंड है जो किसी को पता है?
डेविड एलन हजेले

लग रहा है IE 11 कुछ इस तरह की जरूरत है:var pop_state_event = document.createEvent('Event'); pop_state_event.initEvent('popstate', true, true); window.dispatchEvent(pop_state_event);
डेविड एलन Hjelle

4

आप डेविस की कोशिश कर सकते हैं । यह उपलब्ध होने पर आपको पुशस्टैट का उपयोग करके अपने जावास्क्रिप्ट में रूटिंग देता है और जावास्क्रिप्ट के बिना यह आपके सर्वर साइड कोड को अनुरोधों को संभालने की अनुमति देता है।


4

यहाँ पर रेलेकास्ट के रेयान बेट्स द्वारा इस विषय पर एक बेहतरीन स्क्रीन-कास्ट है। अंत में वह केवल ajax कार्यक्षमता को निष्क्रिय कर देता है यदि history.pushState विधि उपलब्ध नहीं है:

http://railscasts.com/episodes/246-ajax-history-state


2

आप इस jQuery प्लगइन पर एक नज़र रखना चाहते हैं। उनकी साइट पर उनके बहुत सारे उदाहरण हैं। http://www.asual.com/jquery/address/


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

आप modrewrite के साथ सही रास्ते पर हैं। इतिहास एपीआई के प्रबंधन और उपयोगकर्ता के जेएस से निपटने के समाधान में वास्तव में दो अलग चीजें हैं। यदि आपके पास JS नहीं है, तो आपको मानक hrefs और सर्वर प्रतिक्रियाओं के साथ उपयोगकर्ता को संभालना होगा। यदि उपयोगकर्ता का ब्राउज़र इसका समर्थन करता है, तो इतिहास एपीआई एक "अच्छा होना" के रूप में निर्मित हो सकता है।
नाथन टॉटन

एक्सप्रेस और स्टेट सैंपल जो कि jQuery एड्रेस 1.3 के साथ शिप करते हैं, जब जावास्क्रिप्ट अक्षम होता है, तो यह काफी अच्छा काम करता है। दूसरा व्यक्ति mod_rewrite के साथ PHP का उपयोग करता है।
रोस्टिस्लाव

बिल्कुल मेरी चुत। मैं जेएस के बिना साइट बनाने का इरादा रखता हूं, AJAX तत्वों को जोड़ता हूं और फिर यूआरएल को फिर से लिखने, गहरी लिंकिंग को संरक्षित करने के लिए इतिहास का उपयोग करता हूं। सैद्धांतिक रूप से, यह मेरे द्वारा देखे गए किसी भी तरीके से बेहतर तरीका होना चाहिए क्योंकि साइट किसी भी स्तर पर AJAX पर निर्भर नहीं होगी
Mild Fuzz

1
-1 के रूप में jQuery के पते HTML5 राज्य एपीआई का एक सीधा बंदरगाह नहीं है - डेटा या शीर्षक और प्रतिस्थापन का समर्थन नहीं करता है।
बालुपटन

2

मैंने History.js के शीर्ष पर एक बहुत ही सरल राउटर एब्स्ट्रैक्शन लिखा है, जिसे StateRouter.js कहा जाता है । यह विकास के बहुत शुरुआती चरण में है, लेकिन मैं इसे एकल-पृष्ठ एप्लिकेशन में राउटिंग समाधान के रूप में उपयोग कर रहा हूं जो मैं लिख रहा हूं। आप की तरह, मुझे इतिहास मिला। बहुत कठिन है, खासकर जब तक मैं जावास्क्रिप्ट के लिए बहुत नया हूं, जब तक कि मैं समझ गया था कि आपको वास्तव में इसकी आवश्यकता है (या इसके ऊपर एक रूटिंग एब्सट्रैक्शन होना चाहिए, क्योंकि यह एक निम्न-स्तर को हल करता है। संकट।

यह सरल उदाहरण कोड प्रदर्शित होना चाहिए कि इसका उपयोग कैसे किया जाता है:

var router = new staterouter.Router();
// Configure routes
router
  .route('/', getHome)
  .route('/persons', getPersons)
  .route('/persons/:id', getPerson);
// Perform routing of the current state
router.perform();

यहाँ एक छोटी सी पहेली है जो मैंने इसके उपयोग को प्रदर्शित करने के लिए मनगढ़ंत की है।


1
क्रोम पर मैक में यह फील मेरे लिए काम नहीं कर रहा है। यह एक त्रुटि फेंकता है। (अनट्रेडेड रेफरेंस: स्ट्रैटर राउटर को परिभाषित नहीं किया गया है)
DrewT

@DrewT धन्यवाद, fith github.com पर एक बदलाव के कारण टूट गया था, लेकिन मैंने इसके चारों ओर काम किया है।
aknuds1

हाँ, अब त्वरित प्रतिक्रिया के लिए धन्यवाद काम कर रहा है।
DrewT

1

यदि jQuery उपलब्ध है, तो आप jQuery BBQ का उपयोग कर सकते हैं


यह जेएस बंद के साथ विफल हो रहा है।
हल्के फज

यह शायद सच है - इस पर ध्यान नहीं दिया है। मुझे लगता है कि आपको सभी js- लाइब्रेरी-आधारित दृष्टिकोणों के साथ यह समस्या होगी। वे url के हैश भाग में हेरफेर करने पर आधारित हैं।
अंकुरित

1
यह एचटीएमएल 5 हिस्ट्री एपीआई की बात है - यह कुछ भी नहीं तोड़ता है
ब्यूपटन

2
@ मिल्डफज कंप्यूटर बिना किसी बिजली के स्रोत के साथ विफल होता दिख रहा है! मुझे लगता है कि आपके पास आईडी-10-टी त्रुटि है ...
एरिक होडोंस्की

1
विडंबना यह है कि यह आप गलत है
हल्के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.