फ़ायरफ़ॉक्स इतिहास में वापस यात्रा करने के बाद, जावास्क्रिप्ट नहीं चलेगा


84

जब मैं पहले से देखे गए पृष्ठ तक पहुँचने के लिए फ़ायरफ़ॉक्स पर बैक बटन का उपयोग करता हूँ, तो उस पृष्ठ पर स्क्रिप्ट फिर से नहीं चलेगी

क्या दूसरी बार पृष्ठ देखने पर स्क्रिप्ट को फिर से निष्पादित करने के लिए कोई फिक्स / वर्कअराउंड है?

कृपया ध्यान दें कि मैंने Google Chrome और Internet Explorer पर समान पृष्ठों का परीक्षण किया है और वे इरादा के अनुसार काम करते हैं।


इस समस्या का परीक्षण करने के लिए मैंने जिन फ़ाइलों और चरणों का उपयोग किया है:

(0.html पर जाएँ, 1.html, बैक बटन पाने के लिए क्लिक करें)

0.html

<html><body>
<script>
  window.onload = function() { alert('window.onload alert'); };
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

1.html

<html><body>
<p>Go BACK!</p>
</body></html>

जवाबों:


92

एक खाली फ़ंक्शन सेट करें जिसे window.onunload पर कॉल किया जाना है:

window.onunload = function(){}; 

जैसे

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){};
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

स्रोत: http://www.firefoxanswer.com/firefox/672-firefoxanswer.html (संग्रहीत संस्करण)


2
धन्यवाद, यह काम करता है। डिफ़ॉल्ट ऑनुनलोड हैंडलर क्या करता है पर कोई संकेत? (जैसे मैं यहाँ किसी तरह का एक डिफ़ॉल्ट व्यवहार अधिलेखित कर रहा हूँ?)
Patonza

ठीक है धन्यवाद, मैं जांच करूंगा। धन्यवाद फिर से, यह समस्या मुझे थोड़ी देर के लिए सता रही है :)
Patonza

किसी को पता है कि फायरफॉक्स को इसकी आवश्यकता क्यों है जबकि अन्य ब्राउज़र नहीं हैं?
पिम जगेर

7
आप कुछ भी ओवरराइड नहीं कर रहे हैं, यह सिर्फ फ़ायरफ़ॉक्स को बैक-फॉरवर्ड कैश (bfcache) में पेज को कैशिंग करने से रोकता है। developer.mozilla.org/en/DOM/window.onunload developer.mozilla.org/En/Using_Firefox_1.5_caching
क्रिस हास

1
हालांकि यह bfcache को तोड़ना चाहिए दुर्भाग्य से ऐसा लगता है कि यह अभी भी पिछले पृष्ठ को याद करता है - विशेष रूप से, iframe urls जिन्हें फिर से लोड किया जाता है जब आप वापस जाते हैं, और यदि फ़्रेम में रखी जाने वाली आवश्यक सामग्री उत्पन्न होती है, तो क्रॉसब्रोसर प्रतीत नहीं होता है उस नए सिरे से ताज़ा करने का तरीका।
NoBugs 16

76

जब मैं पहले से देखे गए पृष्ठ तक पहुँचने के लिए फ़ायरफ़ॉक्स पर बैक बटन का उपयोग करता हूँ, तो उस पृष्ठ पर स्क्रिप्ट फिर से नहीं चलेगी।

यह सही है और यह अच्छी बात है।

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

इस सुविधा को bfcache कहा जाता है ।

उपयोगकर्ता के पिछले लोड और इसके उपयोग के दौरान आपके द्वारा पृष्ठ पर जोड़ी गई कोई भी सामग्री अभी भी रहेगी। आपके द्वारा पृष्ठ तत्वों से जुड़े किसी भी ईवेंट हैंडलर को अभी भी संलग्न किया जाएगा। आपके द्वारा निर्धारित कोई भी टाइमआउट / अंतराल अभी भी सक्रिय रहेगा। इसलिए शायद ही कोई कारण है कि आपको यह जानने की आवश्यकता है कि आपको छिपाया गया है और फिर से दिखाया गया है। onloadफिर से स्क्रिप्ट कोड को कॉल या इनलाइन करना गलत होगा , क्योंकि उस फ़ंक्शन में आपके द्वारा किया गया कोई भी बाइंडिंग और कॉन्टेंट जेनरेशन संभावित रूप से विनाशकारी परिणामों के साथ, उसी सामग्री पर दूसरी बार निष्पादित होगा। (जैसे; document.writeइनलाइन स्क्रिप्ट पेज को पूरी तरह से नष्ट कर देगी।)

window.onunloadप्रभाव लिखने का कारण यह है कि bfcache को लागू करने वाले ब्राउज़रों ने निर्णय लिया है कि - उन पृष्ठों के साथ संगतता के लिए जिन्हें वास्तव में जानने की आवश्यकता है कि उन्हें कब छोड़ा जा रहा है - ऐसा कोई भी पृष्ठ जो यह जानने में रुचि रखता है कि onunloadऐसा होने पर bfcache किसके कारण होगा विकलांग होना। उस पृष्ठ को नए सिरे से लोड किया जाएगा जब आप bfcache से प्राप्त होने के बजाय, उस पर वापस जाते हैं।

इसलिए यदि आप सेट करते हैं window.onunload= function() {};, तो आप वास्तव में क्या कर रहे हैं जानबूझकर bfcache तोड़ रहा है। यह आपके पृष्ठों को नेविगेट करने में धीमा होगा, और अंतिम उपाय के अलावा इसका उपयोग नहीं किया जाना चाहिए।

यदि आपको यह जानने की आवश्यकता है कि उपयोगकर्ता आपके पेज पर कब जाता है या आपके पेज पर वापस आता है, तो bfcache को गड़बड़ किए बिना, आप इसके बजाय ईवेंट onpageshowऔर onpagehideघटनाओं को फंसा सकते हैं :

window.onload=window.onpageshow= function() {
    alert('Hello!');
};

3
मेरी समस्या यह है कि bfcache सभी पेज को कैश नहीं करता है इसलिए मुझे खोई हुई सामग्री के पुनर्निर्माण के लिए js को फिर से चलाना होगा। इसलिए पूरे पृष्ठ को समझना ठीक हो सकता है। वैसे भी, मैं window.onload घटना का उपयोग नहीं कर रहा हूँ, मैं jQuery के दस्तावेज़ का उपयोग कर रहा हूँ। पहले से ही घटना। क्या आप अभी भी डॉक्यूमेंट का उपयोग करने में सक्षम हैं और इस समस्या से बच सकते हैं?
पाटनजा

bfcache को पूरे पृष्ठ को सामान्य रूप से वापस करना चाहिए क्योंकि जब वह बचा था। पिछले पृष्ठ से लौटने के बाद क्या सामग्री गायब है? (परीक्षण के मामले?) document.readyअनिवार्य रूप से उसी तरह काम करेंगे window.onload( जैसे कुछ ब्राउज़रों के लिए, वे वैसे भी एक ही घटना हैं)।
बोबिन्स

14
यह एक अच्छी बात नहीं है क्योंकि यह फिर से कैश्ड को देखते हुए जावास्क्रिप्ट को नहीं चलाता है ... लेकिन वास्तव में जावास्क्रिप्ट को पहले किए गए परिवर्तनों को कैश नहीं करता है। यदि जावास्क्रिप्ट पृष्ठ लोड पर एक तत्व में फीका होता है, तो यह इतिहास में आने पर इसे फिर से फीका नहीं करता है ... लेकिन इसे 0 अस्पष्टता पर फिर से शुरू करें, जो जावास्क्रिप्ट ने किया था, उसे पूर्ववत करें! यह सभी या कुछ नहीं होना है। यदि आपने जावास्क्रिप्ट को फिर से चलाने के बिना इसे कैश किया हुआ पेश करना चाहते हैं तो आपको जावास्क्रिप्ट चलाने के बाद पेज की पूरी स्थिति को कैश करना होगा!
जिम्बो जॉनी

1
@ जिम्बो: टेस्ट केस प्लीज। bfcache करने का इरादा है (और हर मामले में मैंने कभी देखा है, करता है) DOM over hide / show की सटीक स्थिति को सुरक्षित रखता है। एक तत्व जिसे पृष्ठ में फीका कर दिया गया था, पृष्ठ वापस आने पर अपारदर्शी रहेगा, जब तक कि कोई अन्य स्क्रिप्ट उसे छुपाने के लिए नहीं चलती।
बोबिसन

1
@bobince - एक सीएसएस फ़ाइल के साथ एक तत्व बनाते हैं जो अस्पष्टता को शून्य पर सेट करता है और फिर तैयार दस्तावेज पर इसे फीका करने के लिए कुछ jQuery का उपयोग करता है। इतिहास में वापस जाने पर यह स्टाइलशीट सीएसएस (शून्य) को अपारदर्शिता रखे बिना फिर से करेगा: 1 जिसे जेएस इसे लुप्त होने पर शैली विशेषता में जोड़ देता है। पहली बार जब आप पृष्ठ पर जाते हैं तो तत्व शून्य से 1 तक फीका हो जाएगा। दूसरे पृष्ठ पर जाएं और वापस जाएं और यह पूरी तरह से पारदर्शी हो जाएगा।
जिम्बो जॉनी

23

आप घटना की persistedसंपत्ति की जांच कर सकते हैं pageshow। यह प्रारंभिक पृष्ठ लोड पर गलत पर सेट है। जब पेज कैश से लोड होता है तो यह सही पर सेट होता है।

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From bfcache");
    }
};

किसी कारण से jQuery के पास यह संपत्ति घटना में नहीं है। आप इसे मूल घटना से पा सकते हैं।

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        alert("From bfcache");
    }
});

जावास्क्रिप्ट और jquery दोनों संस्करणों को उपलब्ध कराने के लिए धन्यवाद! आप वहाँ अंत में एक करीबी कोठरी से चूक गए (यह विलाप नहीं है!)। मैं यह भी ध्यान देता हूँ, दूसरों की खातिर, कि IE और क्रोम रिपोर्ट।
मैग्नस स्मिथ 18

जैसा कि मैग्नस ने उल्लेख किया है, यह क्रोम में मेरे लिए तब तक काम नहीं करता जब तक कि मैं स्टेटमेंट नहीं निकालता।
जस्टिन

इसने मेरे लिए क्रोम 58.0.3029.110 (64-बिट) और एफएफ 53.0.2 (64-बिट) में बिना किसी बदलाव के काम किया।
किमी

1

कुछ भी नहीं करता है कि एक "onunload" घटना में तार:

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){}; 
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

यकीन नहीं होता, मैंने एक वोट दिया, ऐसा लग रहा है जैसे किसी ने इस सवाल के हर जवाब को
नकार दिया हो

आपको अपने जवाब में यह जोड़ना चाहिए कि आपके पृष्ठ पर ऑनलोड लोड घटना को जोड़ने से वास्तव में पृष्ठ को उसकी संपूर्णता में कैच किया जा सकता है। यह केवल जेएस को फिर से नहीं चलाता है, यह सर्वर लोड को एक पायदान ऊपर ले जाएगा। यह वास्तव में हल्के में लेने का सुझाव नहीं है, इस पर सावधानी से विचार किया जाना चाहिए।
10

@dreagan, यह bfcache को निष्क्रिय करता है लेकिन जरूरी नहीं कि यह HTTP कैशे हो। HTTP कैश में नियमों का एक पूरा सेट है। यदि आप सर्वर-साइड नींद को वहां फेंकते हैं, तो आपको इसे क्लिक बैक के दौरान नोटिस करना चाहिए। मोज़िला BFCache के लिए FAQ पर अपने तीसरे प्रश्न में इस बारे में बात करते हैं ।
क्रिस हास

मैं BFcache के बारे में बात कर रहा था, इसे निर्दिष्ट करना चाहिए था। इसका मतलब यह नहीं है कि आपको परिणामों की ओपी को सूचित किए बिना इस तरह से सुझाव देना चाहिए। जावास्क्रिप्ट को फिर से आज़माने और आग लगाने के लिए एक वैकल्पिक घटना का उपयोग करना होगा।
प्रात

मैं अभी भी नहीं जानता कि अगर मैं समझता हूं। अगर क्लाइंट का लोकल bfcache बायपास हो जाता है तो "सर्वर लोड एक पायदान ऊपर क्यों जाएगा"? हां, DOM को फिर से बनाना होगा, लेकिन HTML क्लाइंट के HTTP कैश का हिस्सा होना चाहिए। हां, अतिरिक्त संसाधनों को पुनः लोड करने की आवश्यकता होगी, लेकिन वे ग्राहक के HTTP कैश का भी हिस्सा होना चाहिए। के लिए के रूप में onpopstate, जब यह सवाल लगभग पाँच साल है कि घटना पहले कहा गया था अभी भी अपेक्षाकृत नया था और ब्राउज़र समर्थन बहुत असंगत था
क्रिस हास

1

जहाँ तक मुझे पता है फ़ायरफ़ॉक्स onLoadवापस आग की घटना नहीं करता है ।

यहाँ इस लिंक के आधार पर इसके बजाय onFocus को ट्रिगर करना चाहिए ।


यह परीक्षण किया और windows.onfocus क्या वास्तव में कहा जाता है, यहां तक ​​कि खाली window.onunload हैंडलर स्थापित किए बिना। Onunload सेट करना थोड़ा अच्छा है, लेकिन .onfocus भी ठीक होना चाहिए। धन्यवाद :)
Patonza

1

जावास्क्रिप्ट को निष्पादित करने के लिए एक पेज बनाने का एक सरल तरीका जब उपयोगकर्ता ब्राउज़र इतिहास का उपयोग करके इसे वापस नेविगेट करता है, तो OnPopState ईवेंट है। हम अपने होम पेज ( https://fynydd.com ) पर वीडियो को रोकने और पुनः चलाने के लिए इसका उपयोग करते हैं ।

window.onpopstate = function() {

    // Do stuff here...
};

0

अजाक्स संचालन जैसे कुछ मामलों के लिए url परिवर्तन श्रोता का उपयोग किया जा सकता है

$(window).on('hashchange', function() {
        ....
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.