2012-09-27 12 views
9

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

यह ठीक काम करता है लेकिन यह एक समस्या बन जाता है जब कोई दो टैब खोलता है और बी पर होने पर ए-पेज ए 1 के लिंक के साथ टैब 1 में पेज, वे एक नया टैब खोलते हैं और ए-पेज ए 2 पर जाते हैं। जब उपयोगकर्ता टैब 1 में बी-पेज रीफ्रेश करता है तो मेनू ए 2 में बदल जाता है। मैं यह पहचानने में सक्षम होना चाहता हूं कि किस टैब का उपयोग किया जा रहा है ताकि मैं टैब 1 के लिए ए 1 बचा सकूं ताकि यह ए 2 में परिवर्तित न हो।

एक टैब का उपयोग करते समय:

A1 -> B1 -> B2 (the menu points back to A1) 

दो टैब का उपयोग करते समय:

Time   | T1  | T2  | T3   
----------------+----------+----------+------------- 
Tab 1:   | A1 -> B1 |   | [refresh B1] 
Tab 2:   |   | A2 -> B3 |    
----------------+----------+----------+------------- 
Menu points to: | A1 A1 | A2 A2 | A2 

इस उपयोगकर्ता भ्रमित जब वे टैब में वापस 1 उपयोगकर्ता वे टैब 2 में देखे जा रहे आता है (A2) ए 1 के बजाय।

मुझे डर है कि यह संभव ब्राउज़र टैब आईडी प्राप्त करने के लिए, लेकिन किसी एक समाधान के किसी भी विचार हो सकता है नहीं है कर रहा हूँ?

उत्तर

0

संपादित करें: समय बीतने से मेरा मूल उत्तर 2012 से गलत हो गया है। जैसा कि बेडिन इंगित करता है, अब आप Window.sessionStorage object:

सत्रस्टोरेंस संपत्ति आपको वर्तमान उत्पत्ति के लिए एक सत्र संग्रहण ऑब्जेक्ट तक पहुंचने की अनुमति देती है। sessionStorage window.localStorage के समान है, केवल अंतर यह है कि स्थानीय स्टोरेज में संग्रहीत डेटा का कोई समाप्ति सेट नहीं है, सत्र सत्र में संग्रहीत डेटा पृष्ठ सत्र समाप्त होने पर साफ़ हो जाता है। एक पृष्ठ सत्र तब तक चलता है जब तक ब्राउज़र खुला रहता है और पेज रीलोड पर पुनर्स्थापित होता है और पुनर्स्थापित करता है। किसी नए टैब या विंडो में किसी पृष्ठ को खोलने से नया सत्र शुरू किया जाएगा, जो कि सत्र कुकीज़ कैसे काम करता है से अलग है।

मूल उत्तर (2012):

मैं, डर यह एक पोर्टेबल तरह से संभव नहीं होगा हूँ के रूप में आप बाहर पाया है यह अपने आप को एक ब्राउज़र टैब आईडी की तरह कुछ पुनः प्राप्त करने के लिए संभव नहीं है । एचटीएमएल मानकों, जहां तक ​​मुझे पता है, ब्राउज़र में टैब से पूरी तरह से अनजान हैं। कार्यान्वित करके अपने आवेदन में मांगे टैब:

केवल वैकल्पिक हल मुझे लगता है कि कर सकते हैं इस होगा। मैंने कई व्यावसायिक वेब एप्लिकेशन देखे हैं जो ऐसा करते हैं, लेकिन (imho) उपयोगकर्ता अनुभव काफी खराब है।

+0

के अंदर टैब आईडी के कुछ राजा को स्टोर कर सकते हैं यह बहुत बुरा है ... मैंने एक गैर-100%-अविश्वसनीय वर्कअराउंड समाधान पर काम करना शुरू कर दिया है, क्योंकि मुझे डर है कि आप सही हैं। – olofom

0

इसलिए मैंने एक समाधान बनाया है जो बहुत अच्छा काम करता है कोई काम नहीं करता है। अंतिम समस्या-बुलेट देखें। मैं अभी भी बेहतर विचारों की उम्मीद कर रहा हूं इसलिए अगर आपको मिल गया तो कृपया मुझे बताएं!

वैसे भी; यहां मैंने यह कैसे किया। ध्यान रखें कि यह 100% मूर्ख-सबूत समाधान नहीं है, यदि कोई उपयोगकर्ता "गलत व्यवहार" करता है और एक ही समय में कई टैब रीफ्रेश करता है तो यह भ्रमित हो सकता है:

आधार।एचटीएमएल (जो सभी पृष्ठों विरासत) ({{एक}} Django से एक चर renders):।

// This is executed right before leaving the page 
window.onunload = function() { 
    if('{{ A }}' != null) 
     var prev_A = '{{ A }}'; 
    else if (typeof previous_A != 'undefined') { 
     var prev_A = previous_A; 
    else 
     var prev_A = ''; 
    localStorage.setItem('a', prev_A); 
}; 
// Remove the local storage as soon as you get to this page 
localStorage.removeItem('a'); 

B_base.html (आधार सभी बी के टेम्पलेट B_base.html भी base.html इनहेरिट करती है। मैं सिर्फ base.html में कोड)

var previous_A = localStorage.getItem('a'); 

तो बुनियादी तौर पर मैं क्या मिलता है कि हर पृष्ठ localStorage करता है से पहले निष्पादित करने के लिए इस कोड को 'एक' जब यह पेज छोड़ देता है और localStorage 'एक' के रूप में हटा देता है जैसे ही यह पृष्ठ में प्रवेश करता है, बी-पेजों को छोड़कर जो पहले इसे 'ए' को स्थानीय वैरिएबल के रूप में सहेजने से पहले सहेजते हैं।

समस्याएं: एक ही समय में एकाधिक टैब में

  • उद्घाटन लिंक इस चर के ऊपर लिख देगा और एक टैब previous_A बिना किया जाएगा।
  • कहीं भी बिना किसी टैब को बंद करना, फिर एक नया बी-पेज खोलें, जिसके परिणामस्वरूप बी-टैब में ए के पिछले_ए में बंद ए का मान होगा।
  • ए-पेज से नए टैब में ओपन बी-लिंक उन्हें लिंक वापस नहीं देते हैं ... यह डीलब्रेकर है।
+0

इमो, एक तकनीकी बिंदु बिंदु से एक दिलचस्प हैक है, लेकिन उपयोगिता बिंदु से एक अच्छा विचार नहीं है। अच्छा यूआई डिज़ाइन, अन्य चीजों के अलावा, आश्चर्यजनक और असंगत व्यवहार को कम करने के बारे में भी है। और आपके द्वारा वर्णित समस्याओं को ऐसा लगता है कि उन्हें औसत उपयोगकर्ता द्वारा आसानी से याद किया जा सकता है (और इसलिए टाला जा सकता है)। –

+0

नहीं, आप सही हैं, मैंने इसे थोड़ी देर के लिए परीक्षण के बाद फिर से हटा दिया। चूंकि यह 100% काम नहीं करता है क्योंकि उपयोगकर्ता ने अपेक्षा की है कि यह मेरे लिए उपयोगी नहीं है। – olofom

8

एचटीएमएल 5 sessionStorage इस मुद्दे को हल करती है:

साइटें सत्र संग्रहण के लिए डेटा जोड़ सकते हैं, और यह कि विंडो में खोला एक ही साइट से किसी भी पन्ने पर पहुंचा जा सकेगा।

यह है supported by all modern browsers

एक और दृष्टिकोण window.name संपत्ति का प्रयोग है। यह टैब/विंडो विशिष्ट है और ब्राउज़र नेविगेशन पर अपरिवर्तित रहेगा। तो आप अपने window.name संपत्ति