2011-02-26 14 views

उत्तर

27

onpopstate घटना सक्रिय किया जाना चाहिए इतिहास बदल जाता है, आप इसे करने के लिए अपने कोड में इस तरह बाध्य कर सकते हैं:

window.onpopstate = function (event) { 
    // do stuff here 
} 

इस घटना को भी पृष्ठ लोड होने के लिए, आप घटना है कि क्या निर्धारित कर सकते हैं निकाल दिया जा सकता है एक राज्य संपत्ति के लिए घटना वस्तु की जाँच करके निकाल दिया गया था एक पृष्ठ लोड से, या का उपयोग कर pushState/replaceState द्वारा, यह वर्तमान में कोई onpushstate घटना दुर्भाग्य है अगर घटना एक पृष्ठ लोड

window.onpopstate = function (event) { 
    if (event.state) { 
    // history changed because of pushState/replaceState 
    } else { 
    // history changed because of a page load 
    } 
} 

वहाँ के कारण हुई थी अपरिभाषित हो जाएगा , इस के आसपास पाने के लिए आपको लपेटने की जरूरत है अपने स्वयं के ऑनशशस्ट ईवेंट को लागू करने के लिए पुशस्टेट और प्रतिस्थापन दोनों विधियां।

मेरे पास एक लाइब्रेरी है जो पुशस्टेट के साथ काम करना आसान बनाता है, इसे Davis.js नामक चेक आउट करने के लायक हो सकता है, यह पुशस्टेट के आधार पर रूटिंग के साथ काम करने के लिए एक सरल एपीआई प्रदान करता है।

+0

ऐसा लगता है कि event.state अभी भी पेज लोड (क्रोम) पर सेट हो सकता है। – GolezTrol

+2

मोज़िला/फ़ायरफ़ॉक्स पृष्ठ लोड पर एक ऑनपॉपेट ईवेंट नहीं छोड़ता है लेकिन सफारी/क्रोम – tom

+0

मेरे मामले में, यह घटना अजाक्स कॉल की सफलता के बाद होती है। संभवतः इस वजह से, मैं पहली बार घटना का पता लगाने में सक्षम नहीं हूं। अगर मैं बैक/फॉरवर्ड बटन पर क्लिक करता हूं तो यह अच्छा काम करता है हालांकि मैं अपने उपयोगकर्ता को उन इतिहास बटनों पर क्लिक करने की उम्मीद नहीं कर रहा हूं। –

13

मैं उपयोग करने के लिए यह भी जब pushState और replaceState कहा जाता है के बारे में सूचित किया जाता था:

// Add this: 
var _wr = function(type) { 
    var orig = history[type]; 
    return function() { 
     var rv = orig.apply(this, arguments); 
     var e = new Event(type); 
     e.arguments = arguments; 
     window.dispatchEvent(e); 
     return rv; 
    }; 
}; 
history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState'); 

// Use it like this: 
window.addEventListener('replaceState', function(e) { 
    console.warn('THEY DID IT AGAIN!'); 
}); 

हालांकि यह आमतौर पर overkill है। और यह सभी ब्राउज़रों में काम नहीं कर सकता है। (मुझे केवल अपने ब्राउज़र के मेरे संस्करण की परवाह है।)

एनबी। यह Google क्रोम एक्सटेंशन सामग्री स्क्रिप्ट में भी काम नहीं करता है, क्योंकि इसे साइट के जेएस पर्यावरण को बदलने की अनुमति नहीं है। आप कोड के साथ <script> डालने के द्वारा उस पर काम कर सकते हैं, लेकिन यह और भी अधिक है।

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