2008-09-25 6 views
50

क्या जावास्क्रिप्ट में बैक बटन हिट (या बैकस्पेस दबाया जा रहा है) का जवाब देने का कोई तरीका है जब केवल स्थान हैश बदलता है? यह कहना है कि जब ब्राउज़र सर्वर से संचार नहीं कर रहा है या पृष्ठ को पुनः लोड नहीं कर रहा है।जावास्क्रिप्ट में बैक बटन ईवेंट को पकड़ने का कोई तरीका है?

उत्तर

26

उपयोग hashchange घटना:

window.addEventListener("hashchange", function(e) { 
    // ... 
}) 

आप पुराने ब्राउज़र का समर्थन करने के Modernizr का HTML5 क्रॉस ब्राउज़र Polyfills विकि पृष्ठ में hashChange Event section की जाँच की जरूरत है।

+0

यह देखने के लिए अच्छा है कि स्टैक ओवरव्लो के उत्तरों पुराने प्रश्नों के लिए पहले से ही Google हिट के शीर्ष पर हैं। यह मेरे लिए काम करता था, लेकिन अगर कोड बदल गया था तो कोड में कुछ समस्याएं थीं, जिससे हैश चेंज लाइन निष्पादित नहीं हुई। एक अच्छा टिप यह आखिरी करने के लिए हो सकता है। – ironfroggy

+17

वर्तमान ब्राउज़रों में, आपको ऑनशैशचेंज इवेंट http://msdn.microsoft.com/en-us/library/cc288209(v=vs.85).aspx – EricLaw

+0

उत्तर पर अच्छा सुधार करना चाहिए। – pqsk

1

onLocationChange भी उपयोगी हो सकता है। यह सुनिश्चित नहीं है कि यह मोज़िला-केवल एक चीज है, ऐसा लगता है कि यह हो सकता है।

2

क्या आपने इसे देखा? http://developer.yahoo.com/yui/history/

+0

यह वास्तव में दिलचस्प है। अब मुझे यह समझने की जरूरत है कि यह इस व्यवहार को कैसे कर रहा है –

+3

आह, इसलिए यह –

12

मैंने कुछ solution बनाया है जो कुछ लोगों के लिए उपयोग किया जा सकता है। बस अपने पेज पर कोड शामिल करें, और आप अपना स्वयं का फ़ंक्शन लिख सकते हैं जिसे बैक बटन क्लिक करने पर कॉल किया जाएगा।

मैंने आईई, एफएफ, क्रोम और सफारी में परीक्षण किया है, और सभी काम कर रहे हैं। आईई और एफएफ में निरंतर मतदान की आवश्यकता के बिना आईफ्रेम पर आधारित समाधान, हालांकि, अन्य ब्राउज़रों में सीमाओं के कारण, सफारी में स्थान हैश का उपयोग किया जाता है।

+0

पर मतदान करके भी काम करता है यह बहुत चिकना दिखता है, और एक प्रशंसापत्र है। किसी और के पास इसके बारे में कहने के लिए कोई अच्छी चीज है? – MrBoJangles

+0

मुझे नहीं पता कि यह मेरे लिए क्यों काम नहीं करता है, मैंने रास्ते से कोणीय का उपयोग किया, हैश यूआरएल ने आगे बढ़ना शुरू किया और अगली फॉरवर्ड जब मैंने जेएस फ़ाइल लोड की। –

+1

सिर्फ एक लिंक प्रदान करने और समझाते हुए आपने इसका परीक्षण किया - अगर आप यह समझा सकते हैं कि यह कैसे काम करता है और आपने उस मार्ग पर जाने का फैसला क्यों किया, तो यह बहुत उपयोगी होगा। – domdambrogia

6

मैंने अपनी संतुष्टि के लिए इस मुद्दे को हल करने के लिए एक मजेदार हैक किया। मुझे एक AJAX साइट मिली है जो सामग्री को गतिशील रूप से लोड करती है, फिर window.location.hash को संशोधित करती है, और मेरे पास हैश को पार्स करने और उपयुक्त अनुभाग लोड करने के लिए $ (दस्तावेज़) .ready() पर चलाने के लिए कोड था। बात यह है कि मैं नेविगेशन के लिए अपने सेक्शन लोडिंग कोड से पूरी तरह से खुश था, लेकिन ब्राउजर बैक और फॉरवर्ड बटन को अवरुद्ध करने के लिए एक रास्ता जोड़ना चाहता था, जो विंडो स्थान बदलता है, लेकिन मेरे वर्तमान पेज लोडिंग रूटीन में हस्तक्षेप नहीं करता है, जहां मैं हेरफेर करता हूं window.location, और खिड़की पर मतदान। निरंतर अंतराल पर स्थान प्रश्न से बाहर था।

क्या मैं इस तरह के रूप एक वस्तु का निर्माण कर रहा कर समाप्त हो गया:

var pageload = { 
    ignorehashchange: false, 
    loadUrl: function(){ 
     if (pageload.ignorehashchange == false){ 
      //code to parse window.location.hash and load content 
     }; 
    } 
}; 

फिर, मैं एक पंक्ति मेरी साइट स्क्रिप्ट के hashchange घटना पर pageload.loadUrl समारोह को चलाने के लिए इस तरह के रूप में जोड़ा गया,:

window.addEventListener("hashchange", pageload.loadUrl, false); 

फिर, किसी भी समय मैं इस दिनचर्या पेज लोड हो रहा है ट्रिगर किए बिना window.location.hash संशोधित करना चाहते हैं, मैं बस निम्न पंक्ति प्रत्येक window.location.hash = लाइन से पहले जोड़ें:

pageload.ignorehashchange = true; 

और उसके बाद प्रत्येक हैश संशोधन पंक्ति के बाद निम्न पंक्ति:

setTimeout(function(){pageload.ignorehashchange = false;}, 100); 

तो अब मेरी अनुभाग लोड हो रहा है दिनचर्या आम तौर पर चल रहे हैं, लेकिन उपयोगकर्ता 'वापस' या 'आगे' बटन दबाता है, नया स्थान पार्स किया गया है और उपयुक्त अनुभाग लोड किया गया है।

3

history.js देखें। एक एचटीएमएल 5 राज्य परिवर्तन कार्यक्रम है और आप इसे सुन सकते हैं।

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