2012-01-28 10 views
16

समस्या: मेरे पास गतिशील सामग्री वाला एक साइट है जिसे उपयोगकर्ता इसे देखे जाने पर हर बार पुनः लोड करने की आवश्यकता होती है। इसमें उपयोग केस शामिल होता है जब कोई उपयोगकर्ता किसी अन्य साइट पर बैक बटन हिट करता है और पुनः लोड होने के लिए आवश्यक साइट पर आता है। अधिकांश (सभी?) ब्राउज़र इस घटना के बाद साइट को रीफ्रेश नहीं करते हैं।ब्राउज़र के पीछे पहुंचने पर साइट को फिर से लोड करें

मेरे समाधान (जो काफी काम नहीं कर रहा): http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

window.onbeforeunload = function() { 
    // This function does nothing. It won't spawn a confirmation dialog 
    // But it will ensure that the page is not cached by the browser. 
} 

लेकिन यह अभी भी पेज को ताज़ा नहीं है।

कोई भी विचार जो वांछित व्यवहार को प्रभावित/अवरुद्ध कर सकता है? इस समस्या के लिए सम्मानजनक किसी अन्य समाधान सुझाव?

संपादित करें:

निम्नलिखित सेट:

Cache-Control private, must-revalidate, max-age=0 
Expires Sat, 26 Jul 1997 05:00:00 GMT 
Pragma no-cache 

और:

<meta name="cache-control" content="no-cache" /> 
<meta name="expires" content="0" /> 
<meta name="pragma" content="no-cache" /> 

अभी भी कोई सफलता।

+0

देखें कि आपको ब्राउज़र को पृष्ठ कैश करने से रोकने का प्रयास नहीं करना चाहिए। जब मैं बैक बटन का उपयोग करता हूं, तो मैं उस पृष्ठ की अपेक्षा करता हूं जिसे मैं फिर से दिखाना चाहता था क्योंकि जब मैंने इसे छोड़ा था। लेकिन अगर उस पृष्ठ में ऑटो-अपडेटिंग तत्व हैं तो फिर मुझे वापस आने पर अपडेट करना जारी रखना चाहिए। –

+0

दुख की बात है, कभी-कभी आपको इसकी आवश्यकता होती है, उदाहरण के लिए: https://www.quora.com/Why-dont-payment-gateway-pages-support-Back- बटन- रीफ्रेश – ptica

उत्तर

0

क्या इससे मदद मिलती है?

Reload the page on hitting back button

या मेटा टैग के साथ,

<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache --> 
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' --> 
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any --> 

सुनिश्चित नहीं हैं, मेटा में मदद मिलेगी, लेकिन आप इसे परीक्षण कर सकते हैं।

+0

नाप अभी भी काम नहीं करता है, मेरा संपादन देखें प्रश्न – sorgenkind

-1

मुझे लगता है कि this question आपकी मदद करेगा।

[संपादित करें (Nickolay): webkit.org, developer.mozilla.org: यहाँ कारण है कि यह उस तरह से काम करता है। कृपया उन लेखों (या एक अलग नीचे जवाब में मेरे सारांश) पढ़ सकते हैं और विचार करें कि क्या आप वास्तव में इस करते हैं और अपने पृष्ठ लोड अपने उपयोगकर्ताओं के लिए धीमी बनाने की जरूरत है।]

Nickolay's answer

0

मैं आपको लगता है बिल्कुल पुनः लोड करने की आवश्यकता है - window.location.reload()। लेकिन मुख्य मुद्दा क्रॉस ब्राउज़र सरल समाधान है। PHP पर कोड:

$inline_javascript = 'var uniqueString = ' . time() . ';' . 
        'if (uniqueString === window.name) {' . 
        ' window.location.relace();' . 
        '} else {' . 
        ' window.name = uniqueString;' . 
        '}'; 

और इसे सीएसएस और जेएस फ़ाइलों से पहले प्रिंट करें।

2

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

<?php 
     //refresh the page after log-out and back button 
     if (!user_is_logged_in()) 
     { 

      print '<input type="hidden" id="refreshed" value="no"> 
       <script type="text/javascript"> 
        onload=function(){ 

        var e=document.getElementById("refreshed"); 
        if(e.value=="no")e.value="yes"; 
        else{e.value="no";location.reload();} 
        } 
       </script>'; 
     } 
    ?> 

किसी here पोस्ट: धन्यवाद मैं आशा है कि यह आप भी मदद करते हैं।

<input type="hidden" id="refresh" value="no"> 

अब jQuery का उपयोग कर, आप अपने मूल्य की जाँच कर सकते हैं::

$(document).ready(function(e) { 
    var $input = $('#refresh'); 

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes'); 
}); 

जब आप क्लिक

54

आप की "नहीं" एक मूल्य के साथ एक ताज़ा संकेतक के रूप में एक छिपा हुआ input का उपयोग करना चाहिए, बैक बटन पर, छिपे हुए फ़ील्ड में मान उसी मान को बनाए रखते हैं जब आपने मूल रूप से पृष्ठ छोड़ा था।

तो पहली बार जब आप पृष्ठ लोड करते हैं, तो इनपुट का मान "नहीं" होगा। जब आप पृष्ठ पर वापस आते हैं, तो यह "हां" होगा और आपका जावास्क्रिप्ट कोड रीफ्रेश ट्रिगर करेगा।

+3

मेरे लिए काम किया। मुझे सर्वर रीलोड को मजबूर करने के लिए location.reload (true) का उपयोग करना था अन्यथा यह कैश से पुनः लोड किया गया था। – Kris

+1

शानदार और सरल जवाब। बहुत बहुत धन्यवाद। – RohannG

+1

यह खूबसूरती से काम करता है - धन्यवाद। –

0

मुझे एक समाधान मिला: no-storeCache-Control शीर्षलेख में जोड़ें। मैंने इसे http शीर्षलेख में किया, लेकिन मुझे लगता है कि यह मेटा टैग के साथ भी काम कर सकता है। क्रोमियम और फ़ायरफ़ॉक्स में परीक्षण किया गया।

भी देखें How to stop chrome from caching

1

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

header("Cache-Control: no-store, must-revalidate, max-age=0"); 
header("Pragma: no-cache"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 

// आप एक कस्टम मॉड्यूल में इस कोड का उपयोग कर सकता है अतीत

+0

यह उत्तर विस्तार से बताता है - http://stackoverflow.com/a/2068407 –

0

में एक तारीख:

<?php 
/** 
* Implements hook_init(). 
*/ 
function MY_MODULE_init() { 
    drupal_add_http_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate, post-check=0, pre-check=0'); 
} 
?> 
9

के बाद विभिन्न विभिन्न समाधानों का प्रयास कर मैंने पाया है कि जावास्क्रिप्ट नेविगेशन टाइमिंग एपीआई बी काम करता है बैक बटन के साथ इंटरैक्शन का पता लगाने के लिए है।

आपको बस इतना करना है यह है:

if(!!window.performance && window.performance.navigation.type == 2) 
{ 
    window.location.reload(); 
} 

और यह सभी प्रमुख ब्राउज़रों के साथ अच्छी तरह से काम करता है: http://caniuse.com/#search=Navigation%20Timing%20API

Is My Page Being Loaded from the Browser Cache?

+0

मैं इसे सफारी 11.0 में काम नहीं कर सकता। कोई सुराग? – jorgetutor

0

आप अगर परीक्षण करने के लिए window.onpageshow घटना का उपयोग कर सकते पृष्ठ कैश से आता है।

window.onpageshow = function (event) { 
    if (event.persisted) { 
    window.location.reload(); //reload page if it has been loaded from cache 
    } 
}; 

ध्यान दें कि इसके पिछले उत्तरों (जैसे आईई 11 +) की तुलना में अधिक आधुनिक ब्राउज़र की आवश्यकता है। ब्राउज़र समर्थन पर अधिक जानकारी के लिए here