2012-06-07 28 views
9

चेतावनी क्योंhistory.pushState 'popstate' घटना

$(function() { 
    $(window).bind('popstate', function() {alert('pop');}); 

    window.history.pushState(null, '', '/foo'); 
}); 

नहीं है pop को गति प्रदान नहीं करता है?

एनबी: परीक्षण नवीनतम क्रोम

पर -

MDN के अनुसार:

एक popstate घटना हर बार खिड़की भेजा जाता है सक्रिय इतिहास प्रविष्टि बदल जाता है। यदि इतिहास प्रविष्टि सक्रिय की जा रही है तो पुस्टस्टेट या कॉल को प्रतिस्थापित करने के लिए कॉल द्वारा प्रभावित किया गया है, तो पॉपस्टेट ईवेंट की राज्य संपत्ति में इतिहास प्रविष्टि की स्थिति वस्तु की एक प्रति होती है।

तो मेरा pushState क्यों popstate ईवेंट ट्रिगर नहीं करता है?

उत्तर

8

आपके द्वारा संदर्भित अनुच्छेद थोड़ा अस्पष्ट है। उसी पृष्ठ पर example पढ़ना, यह स्पष्ट है कि पॉपस्टेट केवल तभी ट्रिगर होता है जब उपयोगकर्ता बैक बटन पर क्लिक करता है, न कि जब स्क्रिप्ट pushState() पर कॉल करता है।

+5

पॉपस्टेट भी ट्रिगर होता है जब उपयोगकर्ता आगे बटन दबाता है। – circuitry

+0

पुशस्टेट पॉपस्टेट ट्रिगर करता है! इसलिए "सक्रिय इतिहास प्रविष्टि में हर बार विंडो में एक पॉपस्टेट ईवेंट भेजा जाता है"! –

+1

@AlexGill क्या आपके पास एक परीक्षण-केस है जो इस व्यवहार को प्रदर्शित करता है? कुछ ऐसा: ' window.onpopstate = function (e) {alert ('popstate'); } history.pushState (शून्य, ''); ' –

0

मैं भी इसमें भाग गया ... मुझे लगता है कि यदि ईवेंट आपके डेटा ऑब्जेक्ट के शीर्ष स्तर पर कुछ है जो पिछले राज्य से अलग है तो केवल ईवेंट ही आग लगती है।

इस प्रयास करें:

var data = {rand: Math.random()}; 
window.history.pushState(data, '', '/foo'); 
+0

यह पॉपस्टेट को भी कॉल नहीं करता है। फ़ायरफ़ॉक्स 26 पर कम से कम नहीं। – circuitry

2

मेरे समाधान:

var url = "http://awesome.website.net/route/to/paradise"; 
window.history.pushState({}, "", url); 
window.history.pushState({}, "", url); // yes twice 
window.history.back(); 

यह 'popstate' घटना और कोई HTTP अनुरोध के माध्यम से एक नरम-नेविगेशन ट्रिगर किया जाएगा।

+0

क्या यह सभी फ्रंट-एंड फ्रेमवर्क भी करता है? – elliottregan

+0

वह बेकार है, क्योंकि आप अनावश्यक आगे की स्थिति के साथ खत्म हो जाते हैं। नहीं, ढांचे ऐसा नहीं करते हैं। उनके पास सिर्फ एक अच्छा कोड है जो 'पॉपस्टेट' और 'पुशस्टेट' दोनों के बाद एक ही कॉलबैक को कॉल करता है। –

3

आप एमडीएन के "गाइड पेज" को पढ़ रहे हैं जो मानक नहीं है।

ध्यान दें कि सिर्फ बुला history.pushState() या history.replaceState() एक popstate घटना ट्रिगर नहीं करेगा:

पढ़ने MDN के "documentation page" for WindowEventHandlers.onpopstate बजाय विचार करें। पॉपस्टेट ईवेंट केवल ब्राउज़र क्रिया करके बैक बटन पर क्लिक करके (या जावास्क्रिप्ट में इतिहास.बैक() को कॉल करके ट्रिगर किया जाता है)। और ईवेंट केवल तभी ट्रिगर होता है जब उपयोगकर्ता एक ही दस्तावेज़ के लिए दो इतिहास प्रविष्टियों के बीच नेविगेट करता है।

12

आप मैन्युअल रूप से हर बार जब आप history.pushState() फोन window पर popstate घटना हो सकती है।

history.pushState(state, '', url); 

var popStateEvent = new PopStateEvent('popstate', { state: state }); 
dispatchEvent(popStateEvent); 
+0

उत्कृष्ट जवाब, बहुत बहुत धन्यवाद !! – Sachin

0

दस्तावेज़ https://developer.mozilla.org/en-US/docs/Web/Events/popstate का कहना है:

नोट सिर्फ बुला कि history.pushState() या history.replaceState() एक popstate घटना ट्रिगर नहीं करेगा। पॉपस्टेट ईवेंट ब्राउज़र क्रियाएं जैसे बैक या फॉरवर्ड बटन पर क्लिक करके ट्रिगर किया जाएगा (या जावास्क्रिप्ट में history.back() या history.forward() पर कॉल करना)।