2014-06-07 10 views
21

यह प्रश्न अजीब लग सकता है, क्योंकि अधिकांश समय पॉपस्टेट को सिंक्रनाइज़ किया जाता है क्योंकि उपयोगकर्ता बैक बटन दबाते हैं।जब ब्राउज़र पॉपस्टेट ईवेंट को फायर नहीं कर रहा है तो बैक बटन को कैसे संभालें

हालांकि, डब्ल्यू 3 सी स्पेक बताता है कि traversing history (आइटम 14 देखें), यानी एक UA (ब्राउज़र) को पॉपस्टेट कतार में जाने की अनुमति है। popstate को असीमित रूप से निकाल दिया गया है (भले ही यूआरएल इस बिंदु पर बदल गया हो)।

ब्राउज़र विक्रेता इस स्पेक को अलग-अलग समझते हैं और कार्यान्वित करते हैं। Mozilla decides फ़ायरफ़ॉक्स popstateload से पहले, और अच्छे कारणों से आग लगने में सक्षम होना चाहिए, ताकि धीमी छवियां popstate को अवरुद्ध न करें।

क्रोम/सफारी अन्यथा का फैसला करता है, और यह हमारी समस्या की ओर जाता है:

जब एक वेब अनुप्रयोग के लिए इतिहास को प्रबंधित करने, यह जितनी जल्दी हो सके, जैसे के रूप में इतिहास प्रबंधन शुरू करने के लिए अक्सर वांछनीय है। load के बजाय DOMContentLoaded पर। लेकिन बदले में, उपयोगकर्ता pushState से वापस नहीं आ पाए हैं, क्योंकि सभी popstateload तक कतारबद्ध हैं।

हम इस तरह के परिदृश्य को संभालने के तरीकों के लिए सलाह मांग रहे हैं। मैं कुछ खुद के साथ आया हूं:

  • Lazyload छवियों, इसलिए load ASAP को आग लग सकता है।
  • load तक ब्लॉक यूआई निकाल दिया गया है।
  • load पर DOMContentLoaded के बजाय इनिट फ्रेमवर्क।

क्या बेहतर समाधान हैं?

अद्यतन: चीजें बदसूरत मिलती है, जब वहाँ ajax हैं load पहले कि आग, अगर डोम परिवर्तन, और डोम परिवर्तन में उन लोगों के अनुरोध परिणाम कुछ छवियों के लिए होता है, load जब तक उन छवियों को लोड किए गए हैं/समय समाप्ति देरी हो रही है, popstate अर्थ अब तक के लिए कतारबद्ध है।

अद्यतन 2: इसके लिए एक सरल डेमो जोड़ने के लिए, इस jsbin page क्रोम के साथ जाएं और popstate अवरुद्ध हो जाएगा जब तक load निकाल दिया जाता है के लिए। आप कैश्ड छवि और uncached छवि के बीच परिणाम की तुलना कर सकते हैं।

+0

बैक बटन 'पॉपस्टेट' का उपयोग करते समय हमेशा आग लगनी चाहिए। एकमात्र मामला जहां आग लगती है वह तब होती है जब आप रीफ्रेश करते हैं, लेकिन उस स्थिति में आप यूआरआई पर किसी भी तरह से स्वयं को आधार देते हैं (यह ताज़ा करने का बिंदु है)। मुझे कुछ याद आना चाहिए, लेकिन यकीन नहीं है कि क्या। –

+0

@ डेविडमुल्डर मैंने समस्या का प्रदर्शन करने के लिए एक jsbin पृष्ठ जोड़ा है। – bitinn

+0

आह, कम से कम अब मुझे लगता है कि आप 'लोड' होने से पहले एक इतिहास राज्य परिवर्तन फायर कर रहे हैं ... क्यों दुनिया में आप ऐसा कर रहे हैं?केवल एक उपयोगकर्ता को कभी भी राज्य बदलना चाहिए और पहली बार जब ऐप बैक बटन लोड करता है तो उसके पास कोई पिछला ऐप विशिष्ट राज्य नहीं होना चाहिए, इसलिए मैं पूरी तरह उलझन में हूं कि आप क्या करने की कोशिश कर रहे हैं। –

उत्तर

2

क्या आप पिछले पृष्ठ के अनलोड के दौरान पॉपस्टेट को कॉल करने का प्रयास कर सकते हैं। उदाहरण के लिए, यदि आप पृष्ठ 1 में हैं और पृष्ठ 2 पर लोड/लोड के दौरान पॉप स्थिति को कॉल करने के बजाय पृष्ठ 2 पर जाना चाहते हैं, तो आप पृष्ठ 1 के अनलोड ईवेंट में पॉप स्थिति क्यों नहीं कॉल करते?

सुनिश्चित नहीं है कि यह आपके परिदृश्य को संतुष्ट करता है या नहीं। लेकिन मैं इसे अपने बिन में कोशिश करने में सक्षम नहीं था।

+1

जहां तक ​​मुझे पता है, 'popstate' को सीधे आमंत्रित करने का कोई तरीका नहीं है, केवल' history.back() 'या' history.go (-n) 'के साथ ही हैं। जैसा कि उल्लेख किया गया है उन्हें कतारबद्ध किया जाएगा। – bitinn

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