2011-03-14 14 views
23

हाल ही में सफारी 5 जारी किया गया था, और यह मेरी वेबसाइट के लिए कुछ समस्याएं पैदा करता है। मेरे पास क्लासिक एएसपी चलने वाली एक गतिशील वेबसाइट है (हालांकि इससे ज्यादा फर्क नहीं पड़ता) और साइट के इतिहास के ढेर का कुछ रचनात्मक उपयोग है। उदाहरण के लिए, आप ऐसे पृष्ठ पर हो सकते हैं जो उत्पादों को सूचीबद्ध करता है, फिर किसी उत्पाद के बारे में विवरण पर जाएं और उत्पाद (व्यवस्थापक-दृश्य) को बदलें। जब आप उत्पाद पर सहेजते हैं तो जानकारी AJAX के माध्यम से सर्वर पर भेजी जाती है, और history.back() जारी किया जाता है। यह सभी ब्राउज़रों में अच्छा काम करता है (सफारी < = 4 सहित), हालांकि, नई रिलीज सफारी 5 में यह काम करना बंद कर दिया। ऐसा लगता है कि जब आप सफारी 5 में वापस क्लिक करते हैं तो यह वास्तव में पृष्ठ को रीफ्रेश नहीं करता है, यह केवल इसे कैश से लोड करता है, जिसका अर्थ है कि विवरण दृश्य में किए गए परिवर्तन नहीं दिखाए जाते हैं। मैं इस काम को सफारी 5 में भी बनाने के लिए कैसे जा सकता हूं? यह वर्तमान कोड मैं कैशिंग बंद करना होगा (हर पेज के शीर्ष पर शामिल) है:सफारी में बैक-बटन पर कैश को रोकना 5

Dim pStr 
pStr = "private, no-cache, no-store, must-revalidate" 
Response.AddHeader "pragma","no-cache"  '? 
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "cache-control", "post-check=0, pre-check=0"  '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"  '? 
Response.AddHeader "Last-Modified", Now() 

उत्तर

45

खाली unload हैंडलर अब और काम नहीं करेगा। इसके बजाय आप onpageshow ईवेंट की persisted संपत्ति देख सकते हैं। यह प्रारंभिक पृष्ठ लोड पर गलत पर सेट है। जब पृष्ठ bfcache से लोड होता है तो यह सत्य पर सेट होता है।

Kludgish समाधान bfcache से पृष्ठ लोड होने पर एक रीलोड को मजबूर करना है।

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

आप jQuery का उपयोग कर रहे हैं तो कार्य करें:

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload() 
    } 
}); 
+1

ग्रेट फिक्स - आईओएस 6 (आईफोन और आईपैड) के रूप में काम करने की पुष्टि! धन्यवाद मिका! – Jesse

+2

यह सफारी 6, डेस्कटॉप पर भी काम करता है। Window.onunload का पुराना हैक अब लगातार काम नहीं करता है- इसे अब 'सही' उत्तर माना जाना चाहिए। –

+1

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

7

कुछ googeling के बाद और खुदाई मैं एक समाधान मिल गया है, हालांकि मैं इसके बारे में बहुत खुश नहीं हूँ। शरीर टैग में onunload="" सेट करना सफारी को पृष्ठ को अमान्य करने का कारण बनता है और इसे window.history.back(); पर पुनः लोड करता है।

+1

मैं एक ऐसी ही समस्या आ रहा है, सिवाय इसके कि मैं चाहता हूँ उपयोगकर्ता ब्राउज़र-पीठ पर दोबारा सत्यापित किया जाना है (एक iPad पर बारी-बारी से छात्रों) । ऑननलोड = "" हैक एक लैपटॉप पर सफारी पर फिर से सत्यापन को मजबूर करने के लिए ठीक काम करता है, लेकिन आईपैड पर मोबाइल सफारी पर नहीं। कोई विचार? – John

3

यहाँ एक और तरीका है:

function invalidateBackCache() { 
     // necessary for Safari: mobile & desktop 
    } 

    window.addEventListener("unload", invalidateBackCache, false); 

मैं ऐसा करना चाहते हैं इसलिए चुना क्योंकि (ऑनअनलोड = "") एचटीएमएल जोड़ने नेट में शरीर टैग करने के लिए मेरे मामले में तीन फ़ाइलों को संशोधित शामिल किया गया। JQuery में ऑनलोड लोडिंग को सेट करने से इसे हल नहीं किया गया था।

यह मोबाइल सर्फरी (आईपैड) के लिए भी काम करता है।

+2

नहीं, यह मेरे लिए या तो काम नहीं करता (आईपैड पर बैक बटन)। यह केवल ताज़ा करने पर काम कर रहा है। – sirmak

+1

इसका विचार सही है/मेरे लिए काम किया है। मैंने निम्नलिखित jquery आश्रित कोड का उपयोग किया: '$ (विंडो) .on ('अनलोड', फ़ंक्शन() {});' – Sam

+0

ध्यान दें कि मोबाइल सफारी पर हाल के संस्करणों पर अनलोड ईवेंट को समस्याग्रस्त होने की सूचना दी गई थी, ताकि आप चाहें डबल चेक –

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