2013-07-02 11 views
5

एक मानक जावा/स्प्रिंगएमवीसी/जेएसपी/jQuery वेब-ऐप में, मैं रीफ्रेश (AJAX) को सारांश घटक/पैनल रीफ्रेश करने के लिए "बैक" (या history.go (-1)) ईवेंट का पता लगाने की कोशिश कर रहा हूं सामग्री जब मैं किसी पृष्ठ पर वापस आती हूं (जहां हम सारांश घटक द्वारा प्रदर्शित बैकएंड डेटा को बदल सकते हैं)।जावास्क्रिप्ट - बीएफकेएसी/पेजशो इवेंट - event.persisted हमेशा झूठी पर सेट है?

<script type="text/javascript"> 
$(document).ready(function() { 
    window.onpageshow = function(event) { 
     console.log("Event:"); 
     console.dir(event); 
     if (event.persisted) { 
      alert("non-jQuery - back to page - loaded from bfcache"); 
     } else { 
      alert("non-jQuery - loaded page from server"); 
     } 
    }; 
    $(window).on("pageshow", function(event){ 
     console.log("Event:"); 
     console.dir(event); 
     if (event.originalEvent.persisted) { 
      alert("jquery - back to page - loaded from bfcache"); 
     } else { 
      alert("jquery - loaded page from server"); 
     } 
    }); 
}); 
</script> 

मैं OpenSUSE लिनक्स चल रहा हूँ और फ़ायर्फ़ॉक्स और क्रोम (नवीनतम संस्करण) के साथ इस की कोशिश की है, लेकिन हर:

मैं JavaScript में निम्न (StackExchange पर कुछ पदों निम्नलिखित यह कैसे प्राप्त करने के लिए फिर से) की कोशिश की समय की घटना persisted विशेषता false पर सेट की गई है (मैं इसे जावास्क्रिप्ट कंसोल में देख सकता हूं और उपरोक्त कोड से पॉप-अप अलर्ट द्वारा देख सकता हूं)। हर बार, मेरा मतलब है कि यह सर्वर से लोड किया गया था या फिर बैक बटन (या 'बैक' लिंक) के माध्यम से फिर से दिखाया गया था।

मेरा इरादा सर्वर से अद्यतन डेटा के साथ सारांश घटक/पैनल को फिर से लोड करने के लिए एक AJAX कॉल करना था यदि पृष्ठ बैक बटन या history.go(-1) कॉल के माध्यम से दिखा रहा था।

मैं भी एक अनलोड हैंडलर (करता है कुछ भी नहीं है) से bfcache में डाल दिया जा रहा है पेज को रोकने के लिए की स्थापना की कोशिश की लेकिन यह अभी भी एक BF के-कैश्ड संस्करण और event.persisted (या event.originalEvent.persisted) false पर सेट है दिखा रहा है।

क्या यह संपत्ति लिनक्स पर सही ढंग से प्रबंधित की गई है? क्या मैं अपने कोड में कुछ बेवकूफ कर रहा हूँ? किसी भी मदद या विचारों की बहुत सराहना की जाएगी, धन्यवाद!

+0

मुझे नहीं लगता कि इसका लिनक्स के साथ कुछ लेना देना है। मैं इसे मैक पर चल रहा हूं ओएस 10.9 मैवरिक्स दोनों सफारी 7 और फ़ायरफ़ॉक्स 26 के साथ। मैंने सर्वर को कैश-कंट्रोल हेडर भेजने के साथ-साथ हर तकनीक की कोशिश की है ('कैश-कंट्रोल: नो-कैश, अनिवार्य होना चाहिए, अधिकतम आयु = 0')। ब्राउज़र वास्तव में पृष्ठ को फिर से लोड नहीं करते हैं (Wireshark के माध्यम से चेक किया गया), और event.persisted हमेशा झूठा है। – giskard22

उत्तर

0

मैं इस थोड़ी देर हो चुकी पता है, लेकिन यह मेरे लिए काम करता है:

window.onpageshow = function(e) { 

    if (e.persisted) { 

     alert("Page shown"); 
     window.location.reload(); 
    } 
}; 

मैं, नहीं लगता कि आप दस्तावेज़ तैयार समारोह में इसकी जरूरत है बस के रूप में ऊपर वेनिला का उपयोग करें।

+0

यह क्यों कम हो गया है? सफारी पर परीक्षण किया गया यह सही दृष्टिकोण है। – edgarpetrauskas

+1

मुझे नहीं लगता कि यह क्रोम fyi पर काम करता है। –

7

यह bug in Chrome (present in IE11) प्रतीत होता है।

मैं निम्नलिखित तरीके को पाया है:

<input type="hidden" id="cacheTest"></input> 
<script> 
    var input = document.querySelector('#cacheTest') 

    if (input.value === "") { 
    // the page has been loaded from the server, 
    // equivalent of persisted == false 
    } 
    else { 
    // the page has been loaded from the cache, 
    // equivalent of persisted == true 
    } 

    // change the input value so that we can detect 
    // if the page is reloaded from cache later 
    input.value = "some value" 
</script> 

यह सच है कि अधिकांश ब्राउज़रों, जब पेज कैश से भरी हुई है में, प्रपत्र फ़ील्ड्स मान भी संरक्षित कर रहे हैं दोहन करता है।

+0

हालांकि यह क्रोम 39.0.2171.95 (64-बिट) के लिए काम करता है, ऐसा लगता है कि यह आईओएस क्रोम या सफारी 8 में ऐसा नहीं लगता है। कोई सलाह? धन्यवाद –

+0

हाँ वास्तव में मैंने इतिहास.popstate समाधान के साथ उनको तय किया, धन्यवाद –

1

जेएस फ़ाइल में कहीं भी कोड के नीचे रखें। यह पेज (या फॉर्म) के माध्यम से बैक बटन प्रेस को प्रतिबंधित करता है।

window.onload = function() { window.history.forward(); }

4

मैं पाया है छिपे हुए इनपुट बटन एक विश्वसनीय समाधान है जब उपयोगकर्ता वापस पृष्ठ पर जाने के बाद से वे गलत मान पकड़ सकता है नहीं कर रहे हैं और उसके बाद ताज़ा करता है। कुछ ब्राउज़र (फ़ायरफ़ॉक्स) रीफ्रेश पर इनपुट मान बनाए रखते हैं, इसलिए जब भी उपयोगकर्ता रीफ्रेश करता है तो यह फिर से ताज़ा हो जाएगा क्योंकि इनपुट बटन में गलत मान होता है। यह फ़ोरम के लिए एक सामान्य परिदृश्य है (उपयोगकर्ता किसी विषय को देखता है, विषयों की सूची पर वापस जाने के लिए बैक बटन हिट करता है, और नए विषयों के बारे में जांचने के लिए रीफ्रेश करना जारी रख सकता है)।

Grégoire Clermont द्वारा बताया गया है, event.persisted क्रोम (और IE) में गाड़ी है और यह अभी भी के लिए या तो ब्राउज़र फ़रवरी 2017 के रूप में अच्छी खबर यह है कि आप क्रोम और IE के लिए window.performance.navigation.type == 2 पर भरोसा कर सकते तय नहीं किया गया है। विडंबना यह है कि बाद वाले के लिए फ़ायरफ़ॉक्स अविश्वसनीय है लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि यह event.persisted के लिए विश्वसनीय है।निम्नलिखित कोड मेरे लिए काम किया:

if (document.addEventListener) { 
    window.addEventListener('pageshow', function (event) { 
     if (event.persisted || window.performance && 
      window.performance.navigation.type == 2) 
     { 
      location.reload(); 
     } 
    }, 
    false); 
} 
संबंधित मुद्दे