2010-09-17 14 views
5

मैं अभी फ़ायरफ़ॉक्स 3.6/मैक में कुछ अजीब व्यवहार में आया हूं। मुझे संदेह है कि यह सामान्य फ़ायरफ़ॉक्स व्यवहार है, यद्यपि।जावास्क्रिप्ट रीडायरेक्ट (location.href) बैक बटन तोड़ता है जब तक कि सेटटाइमआउट() का उपयोग नहीं किया जाता

मैं नया URL पर नेविगेट करने दो मृत-सरल परीक्षण पृष्ठों कि window.location.href संपत्ति को बदलने बनाया:

आप या तो फ़ाइल के साथ निम्नलिखित का प्रयास करें:

  • नया/खाली ब्राउज़र टैब खोलें।
  • यूआरएल पेस्ट करें और "एंटर" दबाएं।

आप दोनों के बीच एक अंतर देखेंगे: पहले लिंक का उपयोग करके, ब्राउज़र का "बैक" बटन अक्षम कर दिया गया है; दूसरे का उपयोग करके, यह सक्षम है और काम करता है क्योंकि मैं इसकी अपेक्षा करता हूं।

दो स्क्रिप्ट के बीच एकमात्र अंतर यह है कि बाद में window.location.href बदलने से पहले एक-सेकंड टाइमआउट सेट करता है।

मुझे नहीं पता कि ऐसा क्यों होता है, और मैं दूसरी स्क्रिप्ट के व्यवहार को प्राप्त करने की कोशिश कर रहा हूं (जहां "बैक" बटन उपयोगकर्ता के लिए कोई देरी किए बिना अपेक्षित काम करता है)।

मेरे सबसे अच्छा अनुमान है कि शायद फ़ायरफ़ॉक्स व्यवहार करता है एक तत्काल "redirect", window.location.replace() विधि का उपयोग कर के बाद से मुझे लगता है कि यह एक आम बात है डेवलपर्स पूर्व का उपयोग करने के लिए जब वे बाद का उपयोग करने के लिए होती रूप window.location.href ही की स्थापना कर रहा है। शायद setTimeout का उपयोग कर, क्योंकि इससे कोड को असीमित रूप से चलाने का कारण बनता है, इस व्यवहार को पराजित करता है। क्या यह मामला हो सकता है?

वांछित प्रभाव प्राप्त करने के लिए मैंने setTimeout के न्यूनतम मूल्य के साथ प्रयोग नहीं किया है, लेकिन अब मैं यह करूँगा। मैं यह जानना चाहता हूं कि यह वास्तव में क्यों होता है।

धन्यवाद!

+0

पहला मेरे लिए पूरी तरह से काम करता है: बैक बटन दबाएं और इस पृष्ठ पर वापस आएं। दूसरे के लिए, एक पीठ एक खाली पृष्ठ दिखाता है, दूसरी पीठ यहां वापस आती है। यदि मैं एक नए टैब में खुलता हूं, तो पहले के रूप में काम करता है, कोई वापस उपलब्ध नहीं है। दूसरा एक खाली पृष्ठ पर वापस चला जाता है। ये सभी सटीक व्यवहार हैं जिन्हें मैं आपके विवरण से अपेक्षा करता हूं। –

+2

@ स्किप हेड - क्यों? एक टाइमआउट सेट करने से व्यवहार में बदलाव क्यों होगा? – sje397

+1

आपके लिए कुछ और ब्राउज़र का परीक्षण किया गया: मैक के लिए लिनक्स/मैक और ओपेरा पर क्रोम पर होता है। लिनक्स के लिए मैक या फ़ायरफ़ॉक्स के लिए सफारी पर नहीं होता है। – Robert

उत्तर

1

मेरा सबसे अच्छा अनुमान यह है कि शायद फ़ायरफ़ॉक्स window.location.href को विंडो.लोकेशन.रेप्लेस() विधि का उपयोग करने के समान तत्काल "रीडायरेक्ट" का इलाज करता है, क्योंकि मुझे लगता है कि डेवलपर्स के लिए यह सामान्य है पूर्व जब वे उत्तरार्द्ध का उपयोग करना था। शायद setTimeout का उपयोग कर, क्योंकि कोड को असीमित रूप से चलाने का कारण बनता है, इस व्यवहार को हरा देता है। क्या यह मामला हो सकता है?

मैं किया गया है told अपने अनुमान सही है, लेकिन अब है कि मैं देखने के लिए, वहाँ है HTML5 spec (सबसे प्रासंगिक पृष्ठ पर जोड़ने में इस आवश्यकता का कोई उल्लेख होने के लिए प्रकट नहीं होता है, क्योंकि यह लिंक करने के लिए मुश्किल है आवश्यकता की अनुपस्थिति के लिए)।

2

आप यह मानने में सही हैं कि पृष्ठ लोड होने पर सेटिंग.href को प्रतिस्थापित किया जाता है। वास्तव में दो अलग-अलग व्यवहार हैं।

पहला यह है कि टैग को पार्स करने के परिणामस्वरूप स्क्रिप्ट चल रहा है। Href को हमेशा एक प्रतिस्थापन के रूप में व्याख्या किया जाता है। नेटस्केप 4 व्यवहार और subsequentlytweaked दर्पण करने के लिए यह implemented था।

दूसरा यह है कि ऑनलोड हैंडलर के परिणामस्वरूप लोड किया गया कोई भी नया दस्तावेज़ हमेशा प्रतिस्थापन के रूप में भी व्याख्या किया जाता है। यह implemented और tweaked था।

लेकिन मुझे उत्सुकता है कि आप ऐसा करने के लिए इतने उत्सुक क्यों हैं, इसका मतलब है कि उपयोगकर्ताओं को आपके पृष्ठ से पहले पृष्ठ पर जाने के लिए बैक ड्रॉप-डाउन मेनू का उपयोग करना होगा। (एक पृष्ठ पर वापस जाने का कोई फायदा नहीं होगा यदि यह उन्हें वर्तमान पृष्ठ पर रीडायरेक्ट करने पर रखा जाता है।)

+0

एक कारण है कि कोई इतिहास में वर्तमान पृष्ठ को प्रतिस्थापित नहीं करना चाहता: मेरे पास एक बुकमार्कलेट है जो एक साइट पर किसी पृष्ठ से कूदने के लिए window.location को असाइन करता है (जो मेरे पास नहीं है) किसी अन्य पृष्ठ पर संबंधित पृष्ठ पर साइट। सेटटाइमआउट के बिना, बुकमार्कलेट का उपयोग इतिहास से शुरुआती पृष्ठ मिटा देता है। सेटटाइमआउट के साथ, यह जिस तरह से अपेक्षा करता है, वह काम करता है: बुकमार्कलेट हिट करें, दूसरे पेज पर जाएं, फिर वापस आने के लिए वापस जाएं जहां से आप आए थे। –

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