2012-05-25 7 views
12

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

हालांकि मुझे पता चला है कि क्रोम और सफारी प्रारंभिक पृष्ठ लोड को पॉपस्टेट के रूप में मानता है और इसलिए यह मुझे दुःख पैदा कर रहा है। क्या इसे रोकने का कोई तरीका है?

$(window).on("popstate", function() { 
    if ($('body').hasClass('info')) { 
    $('body').removeClass("info").addClass("work"); 
    $('.info_overlay').fadeOut(duration); 
    alert('popstate'); 

    } else if ($('body').hasClass('work')) { 
    $('body').removeClass("work").addClass("info"); 
    $('.info_overlay').fadeIn(duration);  

    } else { 
    $('body').removeClass("project").addClass("work"); 
    $('.project_overlay').fadeOut(duration); 
    } 
}); 

उत्तर

3

मुझे वास्तव में pjax के भीतर समाधान मिला।

कर के बजाय

:

$(window).on('popstate', function() { ... 

जो प्रारंभिक पृष्ठ लोड मैंने किया था पर popstate निकाल दिया:

$(window).on('pjax:popstate', function() {... 
+0

क्रोम में मेरे लिए काम नहीं करता 39 – s29

29

टैग राज्य जब आप pushState() फोन, तो सभी popstate घटनाओं पर ही आपके टैग की जरूरत नहीं है पर ध्यान न दें। जैसे

history.pushState({ myTag: true }, ...) 

$(window).on("popstate", function(e) { 
    if (!e.originalEvent.state.myTag) return; // not my problem 
    // rest of your popstate handler goes here 
} 

पृष्ठ लोड पर replaceState कॉल करने के लिए इतना है कि आप popstate संभाल कर सकते हैं जब आप वापस प्रारंभिक पृष्ठ लोड करने के लिए मिल मत भूलना।

$(function() { history.replaceState({ myTag: true }); }); 
+0

मुझे वास्तव में पता चला कि समाधान pjax के भीतर है। तो –

+0

करने के बजाय यह एकमात्र समाधान है जो मैंने पाया है कि एक पृष्ठ के पहले कॉल के बाद, एक रीलोड और gecko/webkit/trident में काम करता है। पॉपस्टेट को कॉल करने वाले व्यवहार ब्राउज़र को बदले बिना! महान समाधान धन्यवाद! – griffla

+0

आज मेरे परीक्षणों में, 'event.originalEvent' किसी भी मौजूदा ब्राउज़र में मौजूद नहीं है। जबकि इसमें बदलाव ('event.state' का उपयोग करके) क्रोम और फ़ायरफ़ॉक्स के मौजूदा संस्करणों में काम करता प्रतीत होता है, सफारी (8.0.6) को' event.state' के लिए 'null' वापस मिल जाता है और मुझे _any_ नहीं मिल रहा है डेटा को बाद में संदर्भ के लिए 'pushState' के साथ धक्का दिया गया। सफारी नई आईई 6 है। –

2

सबसे अच्छा दीर्घकालिक ठीक करने के लिए है ऊपर वोट https://code.google.com/p/chromium/issues/detail?id=63040 गूगल ठीक करने के लिए प्राप्त करने के लिए इस। उन्हें पता है कि वे लगभग दो वर्षों के लिए एचटीएमएल 5 spec के अनुपालन से बाहर हैं।

+1

यह कहता है 'स्थिति: फिक्स्ड' और वहां एक टिप्पणी: "क्रोम कैनरी 34 पर तय क्रोम 32 स्थिर पर अभी भी उतरा नहीं है।" - 10 फरवरी, 2014. – MMachinegun

0
var StateHelper = { 

    pushState: function(url) { 
     if(window.history.pushState) { 
      window.history.pushState({"popstate": true}, '', url); 
     } 
    }, 

    updateStateData: function(stateData) { 
     if(window.history.replaceState) { 
      window.history.replaceState(stateData, '', window.location.href); 
     } 
    } 
}; 

/** 
* NOTE: Webkit fires popstate event initial. So we modify the current state, but in the 
* event we still get null. So we can differentiate. 
*/ 
StateHelper.updateStateData({"popstate": true}); 
window.addEvent('popstate', function(e) { 
    if(e.event.state && e.event.state.popstate) { 
     window.fireEvent('pophistory', e); 
    } 
}); 

(एक mootools समाधान) सफारी और क्रोम ब्राउज़र में एक popstate के रूप में प्रारंभिक पृष्ठ लोड हल करने के लिए

+2

स्टैक ओवरफ़्लो में आपका स्वागत है! कृपया बताएं कि आपका कोड क्या करता है और यह समस्या का समाधान क्यों करेगा। एक उत्तर जिसमें केवल कोड होता है (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा। – SuperBiasedMan

1

, हम setTimeout फ़ंक्शन का उपयोग कर सकते हैं।

यह बस काम करता है !!

setTimeout(function() { 
     window.addEventListener('popstate', myFunction, false); 
    }, 500);