2012-06-06 22 views
8

में इतिहास.जेएस हैश फ़ॉलबैक मैं एक ऐसी वेबसाइट को कार्यान्वित कर रहा हूं जो इतिहास.जेएस का उपयोग करके गतिशील रूप से अपने यूआरएल सेट करता है जब नए अनुभाग AJAX के माध्यम से सामने वाले पृष्ठ पर लोड होते हैं।इंटरनेट एक्सप्लोरर और पुशस्टेट समस्या

यह अच्छी तरह से काम करता प्रतीत होता है लेकिन यूआरएल में हैश सेक्शन में समस्या है कि History.js इंटरनेट एक्सप्लोरर में फॉलबैक के रूप में बनाता है।

function connect_browse_buttons(){ 
    $('.browselink').each(function(){ 
     $(this).click(function(){ 
      var action = $(this).attr('name'); 
      action = action.substring(('action_browse').length); 
      browsetype = action; 
      if (isIE){ 
       // remove data object and title to avoid use of SUIDs by History.js in IE 
       History.pushState(null, null, '/public/' + action); 
      } else { 
       History.pushState({oldurl: History.getState()['url']}, "Example " + action, config.wwwroot + "public/" + action); 
      } 
      return false; 
     }); 
    }); 
} 

.htaccess फाइल जैसे http://example.com/public/category_ahttp://example.com, जहां जावास्क्रिप्ट यूआरएल को पार्स करता है और ajax के माध्यम से उचित अनुभाग लोड करता है के लिए किसी भी यूआरएल पुनर्निर्देश:

यहाँ पृष्ठ पर लिंक के उदाहरण हैं, का उपयोग कर jQuery बनाया परिवर्तनस्टेट हैंडलर में अनुरोध।

ऐसे

http://example.com/public/category_a 

के रूप में और इंटरनेट एक्सप्लोरर में बनाया बराबर वापस आने यूआरएल के लिए यूआरएल के लिए जावास्क्रिप्ट चेक, यानी

http://example.com/#public/category_a 

सब ठीक काम करता है कि - तो:

Firefox में, यदि मैं साइट की रूट पर साइट खोलता हूं, http://example.com, और ऊपर दिए गए लिंक पर क्लिक करें, सामग्री लो (ChangeState हैंडलर में) विज्ञापन, और यूआरएल के रूप में History.pushState द्वारा निर्धारित है:

http://example.com/public/category_a 

मैं तो एक और लिंक यूआरएल के रूप में सेट किया गया है, उदाहरण के लिए पर क्लिक करते हैं:

http://example.com/public/category_b 

आईई में, एक लिंक पर क्लिक करता है, तो मैं साइट के रूट पर साइट खोलें, और, इसके बाद के संस्करण के अनुसार, सामग्री लोड होता है और यूआरएल के रूप में एक हैश के साथ सेट है:

http://example.com/#public/category_a 

अगर मैं तो सीएल अगले लिंक पर ick, url सेट के रूप में किया जाता है:

http://example.com/#public/category_b 

समस्या पैदा होती है जब मैं IE में एक पेज कि फ़ायरफ़ॉक्स में बुकमार्क था खोलें, और यूआरएल में हैश जरूरत नहीं है। चलो हमारे सामान्य उदाहरण लेते हैं: अगर मैं IE में सीधे इस यूआरएल को खोलने, एक बुकमार्क के माध्यम से या ब्राउज़र पता पट्टी में url को चिपकाकर

http://example.com/public/category_a 

, .htaccess सफलतापूर्वक पुनर्निर्देश, यूआरएल js से ठीक पार्स किया गया है फ़ाइल और सामग्री लोड करता है। हालांकि, अब अगर मैं category_b लिंक पर क्लिक करें, यूआरएल History.pushState पर सेट है:

http://example.com/#public/category_b 

हालांकि, इतिहास:

http://example.com/public/category_a#./category_b 

क्या मैं सच में करना चाहता था के रूप में यूआरएल स्थापित करने के लिए किया गया था। जेएस बाद के पुशस्टेट्स के लिए बेस यूआरएल के रूप में पिछले यूआरएल को पूरा करने लगता है। मैंने History.pushState में पूर्ण यूआरएल सेट करने की कोशिश की है लेकिन सफलता के बिना। जैसा कि आप उपरोक्त कोड ब्लॉक में देख सकते हैं, मेरे पास एक आईई-विशिष्ट पुशस्टेट कथन है। मैंने इसे विभिन्न तरीकों से कॉन्फ़िगर करने का प्रयास किया है।मैं इतिहास pushState की पहचान करा सकते हैं:

http://example.com 
यूआरएल, जो हैश अनुभाग के साथ जोड़ दिया जाना चाहिए के आधार भाग के रूप में

? या ऊपर वर्णित तरीके से इस दृष्टिकोण से संपर्क करने का एक बेहतर तरीका है?

+0

नमस्ते, क्या आपको किसी पृष्ठ को रीफ्रेश होने की समस्या के समाधान के लिए कोई समाधान मिल गया, ब्राउज़र वर्तमान के बजाय पहला यूआरएल लोड करता है ?? –

+0

क्या आपने यह quesiton पढ़ा था ?: http://stackoverflow.com/questions/14342912/using-history-pushstate-in-ie9 शायद आप कुछ सहायक टिप्स पा सकते हैं – nikoskip

+0

सार्वजनिक/श्रेणी_ए और "रीडायरेक्ट" पर पुशस्टेट क्यों नहीं करें # जब पुशस्टेट काम करता है हैश को हटाने के लिए? –

उत्तर

0

AFAIK, इतिहास एपीआई हमेशा पूरे यूआरएल (सैन्स हैश) का उपयोग करेगा जिसे प्रारंभिक पृष्ठ लोड के लिए अनुरोध किया गया था। एक बार पृष्ठ लोड हो जाने के बाद, आप प्रारंभिक यूआरएल के बाद जो कुछ भी आते हैं उसे बदलने के लिए आप इतिहास एपीआई का उपयोग कर सकते हैं या आप उस प्रारंभिक यूआरएल के बाद आने वाले बदलावों को बदलने के लिए हैश परिवर्तन का उपयोग कर सकते हैं, लेकिन पूरे पृष्ठ को पुनः लोड किए बिना इसे संशोधित करने का कोई तरीका नहीं है।

एकमात्र विकल्प जिसे मैं आप जो खोज रहा हूं उसे प्राप्त करने के बारे में जानता हूं, यह है कि आपका सर्वर सभी वांछित बेस यूआरएल पर रीडायरेक्ट/पुनर्लेखित करें और फिर अपने पथ, फ़ाइल नाम, पैरामीटर, हैश इत्यादि को पास करें क्लाइंट साइड राउटर/नियंत्रक। मुझे इसके खिलाफ सलाह देना है क्योंकि (फेसबुक पर साझा की गई आपकी वेबसाइट से लिंक बहुत अधिक विस्तार के बिना) हमेशा http://example.com/ या जो भी आपका मूल यूआरएल होगा।

मेरी राय में और मेरे अभ्यास में, मैं इतिहास एपीआई का उपयोग नहीं करता और इसके बजाय हैश परिवर्तन का उपयोग करता हूं क्योंकि यह हर जगह काम करता है। यह हमेशा करने के लिए सुंदर नहीं है, लेकिन मुझे लगता है कि आपको हैश के अतिरिक्त यूआरएल के लिए उचित वेब सर्वर प्रतिक्रिया करने का प्रयास करना चाहिए। यह मेरी वेबसाइट की एक विशेष रूप से बदसूरत यूआरएल है: http://www.respectfulrevolution.org/road/videos/ian_barlow_finding_our_roots_forest#/road/videos/marcy_westerling_livingly_dying, लेकिन जब ब्राउज़र में लोड किया जाता है, तो सर्वर यहां दिखाई देता है जो आप यहां देखते हैं: http://www.respectfulrevolution.org/road/videos/ian_barlow_finding_our_roots_forest और उसके बाद क्लाइंट साइड कंट्रोलर जो आप यहां देखते हैं उसे लोड करता है: http://www.respectfulrevolution.org/#/road/videos/marcy_westering_livingly_dying जो लोड होना चाहिए जैसा कि: http://www.respectfulrevolution.org/road/videos/marcy_westering_livingly_dying