2010-04-08 11 views
24

में रीफ्रेशिंग करने के लिए मुझे हैश को संशोधित करने की आवश्यकता है, कुछ प्रोसेसिंग के बाद इसे हटा दें ताकि उपयोगकर्ता रीफ्रेश हो जाए तो वे प्रक्रिया को फिर से चलाने का कारण नहीं बनते हैं।जावास्क्रिप्ट location.hash आईई

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

मुझे सभी लोडिंग पूर्ण होने के बाद हैश को बदलने का एक अच्छा तरीका पता नहीं लग रहा है। और, साथ ही यह भी सकारात्मक नहीं है कि यह लोडिंग से संबंधित है।

इसे हल करने के तरीके पर कोई विचार?

अधिक अजीब व्यवहार: हैश अन्यथा से आ रहा है जहां वेब ऐप में रीडायरेक्ट के माध्यम से। मैंने पाया है कि क्या मैं हाथ से हैश जोड़ता हूं, यूआरएल में #myid जोड़ता हूं, यह पुनः लोड नहीं होता है। इससे कोई फर्क नहीं पड़ता कि मैं उस पृष्ठ पर हैश दर्ज कर चुका हूं जो पहले ही लोड हो चुका है (पहले से मौजूद यूआरएल में #myid जोड़ रहा है) या एक नए टैब में पूरा यूआरएल दर्ज करके।

+0

http://stackoverflow.com/questions/1985056/response-redirect-with-a-fragment-identifier-causes-unexpected-refresh-when-later – casey

+0

क्या आप प्रजनन चरणों को प्रदान कर सकते हैं? मेरे पास बच निकलने वाले यूआरएल (# !, उर्फ ​​हैश-बैंग) का उपयोग कर एक वेबसाइट है और मैं इस त्रुटि को पुन: उत्पन्न करने में असमर्थ हूं। IE9.0.8 और IE10RP पर परीक्षण किया गया। –

उत्तर

-5

ऐसा लगता है कि यदि आप हैश बदलते हैं, तो आप मूल रूप से पृष्ठ के स्थान को बदल रहे हैं, और इसलिए आईई (या कोई ब्राउज़र) फिर से लोड हो जाएगा। आप यह कैसे करने की कोशिश कर रहे हैं? window.location.hash = "";?

शायद फ़ायरफ़ॉक्स सिर्फ यह देखने के लिए पर्याप्त स्मार्ट है कि आप क्या कर रहे हैं और रीफ्रेश से बचें।

+0

हैश के बारे में बात यह है कि इसे ब्राउज़र द्वारा भौतिक स्थान के टुकड़े के रूप में नहीं माना जाता है, यह केवल क्लाइंट का हिस्सा है, यह सर्वर पर नहीं भेजा जाता है। यह किसी भी ब्राउज़र में पृष्ठ को फिर से लोड नहीं करना है, यह आपको पृष्ठ पर एक एंकर पर ले जाना है। – aepheus

+0

ठीक है, मैंने अभी आईई 8 में कोशिश की है और यह मेरे जवाब को अस्वीकार कर दिया है :) - मैंने एक पेज पर कुछ बटन डाले हैं। एक में, मैंने window.location.hash को एक मान पर सेट किया - मुझे एंकर पर भेजा गया। दूसरे बटन में मैंने window.location.hash को "" खाली स्ट्रिंग पर सेट किया है - क्लिक करके मुझे पृष्ठ के शीर्ष पर वापस भेज दिया गया है। किसी भी मामले में पेज को सर्वर से रीफ्रेश नहीं किया गया था। इसलिए, यदि आप कोड पोस्ट करते हैं जहां आप कार्य कर रहे हैं, तो शायद कोई समस्या को देखेगा। – Ray

10

समस्या यह है कि "हैश अन्यथा से आ रहा है जहां वेब ऐप में रीडायरेक्ट के माध्यम से।"। आप जावास्क्रिप्ट का उपयोग करते हैं इस तरह ग्राहक में यूआरएल अनुप्रेषित करने:

location.href = 'test1.aspx#testhash' 

यह ठीक हो जाएगा!

तो यह आईई बग है: जब एक रीडायरेक्ट के माध्यम से एक वेब ऐप, ब्राउज़र केवल पिछला यूआरएल देख सकता है, इसलिए जब आप location.hash संशोधित करते हैं, तो ब्राउज़र यूआरएल परिवर्तन को देखता है, इसलिए पृष्ठ को रीफ्रेश करता है।

-3

आप जावास्क्रिप्ट का उपयोग करते हैं हैश स्थापित करने के लिए उपयोग नहीं करते हैं एक "#"

window.location.hash = '#foo'; //IE will reload the page 
window.location.hash = 'foo'; //IE will set the hash but will not reload the page 
+7

मुझे नहीं लगता कि यह काम करता है जैसे आपको लगता है कि यह काम करता है। –

17

यह इंटरनेट एक्सप्लोरर साथ एक बग प्रतीत होता है (7 के साथ परीक्षण किया और 8)।

विंडो बदलना window.location.hash का परिणाम पुनः लोड नहीं होना चाहिए, और यह राज्य को बनाए रखने के लिए हैश का उपयोग करने के लिए एक सामान्य जावास्क्रिप्ट तकनीक है।

यदि आप मैन्युअल रूप से पृष्ठ लोड करते हैं और जावास्क्रिप्ट का उपयोग करके हैश को बदलते हैं तो यह काम करेगा।

समस्या तब होती है जब आप किसी अन्य स्थान से पृष्ठ पर रीडायरेक्ट किए जाते हैं (यानी: HTTP शीर्षलेख "स्थान" का उपयोग करके), फिर हैश को संशोधित करने के परिणामस्वरूप एक रीलोड होगा।

इस बग आप कर सकते थे चारों ओर पाने के लिए:

1) आप रीडायरेक्ट को नियंत्रित कर सकते हैं, तो आप कुछ HTML के साथ स्थान हैडर बदल सकते थे।

<html> 
<head> 
    <meta http-equiv="refresh" content="0; url=__REDIRECT_LOCATION__"> 
    <script>window.location = "__REDIRECT_LOCATION__";</script> 
</head> 
</html> 

2) यदि नहीं, आप जब यह भरी हुई है पेज लोड करने का प्रयास कर सकता है। एक रीलोड लूप को रोकने के लिए आपको कुकी सेट करने की आवश्यकता हो सकती है।

window.location = window.location; // window.location.reload() didn't work. 

In pseudo code: 

// if is Internet Explorer 
//  if (cookie "reloadPerformed" is not set) 
//   set cookie "reloadPerformed" = "1" 
//   reload page 
//  else 
//   clear cookie "reloadPerformed" 

स्पष्ट रूप से दोष यह है कि दो पेज अनुरोध & में पेज परिणाम लोड प्रस्तुत करना है, तो आप फिर से लोड पहली बातें जब यह लोड करता है पेज करता है में से एक होने के लिए चाहते हैं जाएगा।

+0

मुझे डर है कि उपयोगकर्ता # कुकीज निष्क्रिय होने पर समाधान # 2 का परिणाम लूप होगा। – Sliq

+0

यह बग आईई 8 के साथ विंडोज विस्टा/सर्वर 2008 पर होता है लेकिन आईई 8 के साथ विंडोज 7 पर नहीं ... –

14

@JarneCook सही लगता है - यह आईई में एक बग है।

<script type="text/javascript"> 
    window.location.hash = window.location.hash; 
</script> 

अपने पेज के शीर्ष पर:

तुम बस ऐसा करने में सक्षम हो सकता है। सामान्य परिस्थितियों में, यह नो-ऑप होना चाहिए, लेकिन यदि उपयोगकर्ता आईई का उपयोग कर रहा है और रीडायरेक्ट के माध्यम से पहुंचा है, तो पेज लोड होने से पहले पेज फिर से लोड हो जाएगा।

+0

यह सबसे अच्छा कामकाज है! आईई HTTP रेफरर के लिए जांचता है और रीडायरेक्ट के मामले में, यह गायब है। इस प्रकार, IE पृष्ठ को रीफ्रेश करता है जैसे ही यह window.location.hash सेट होता है। –

+0

बेस्ट वर्कअराउंड धन्यवाद! – Nivco

+0

इस समाधान ने मेरे दिन को बचाया। धन्यवाद बहुत धन्यवाद @ आरजेएमनरो, और _GO टू आईई आईई! _ – Feugy

1

इसी तरह की समस्या मेरे प्रोजेक्ट में मौजूद थी। लेकिन हम ऊपर वर्णित विधियों का उपयोग नहीं कर सके, क्योंकि जब आईई ने एक पृष्ठ को ताज़ा किया, तो प्रीलोड किए गए डेटा को रीसेट कर दिया गया था। तो, हमने ब्राउज़र की सुविधा का उपयोग किया। जब आप 'ए' टैग के लिए क्लिक करते हैं, तो ऑनक्लिक ईवेंट पहली बार हुआ और ईवेंट ब्राउज़र के बाद रीडायरेक्ट करने के लिए 'href' विशेषता का उपयोग करें। जब IE रीडायरेक्टिंग के लिए हैश के साथ href का उपयोग करता है, फिर से लोड नहीं होता है। तो, आप सर्वर-साइड प्रसंस्करण (उदाहरण के लिए एएसपीनेट के लिए __ doPostBack) के लिए ऑनक्लिक ईवेंट का उपयोग कर सकते हैं और जब प्रसंस्करण निष्पादित किया जाएगा, ब्राउज़र पुनर्निर्देशन के लिए 'href' विशेषता का उपयोग करेगा। तो, नया पृष्ठ पुनः लोड नहीं किया जाएगा। इसके अलावा आप सर्वर-साइड प्रसंस्करण के बाद window.location = yourNewLocationWithHash का उपयोग कर सकते हैं। मुझे आशा है कि यह मदद =)

0

यहां एक क्रॉस-ब्राउज़र समाधान है। आईई, क्रोम, सफारी, और एफएफ में काम करता है (नवीनतम संस्करणों के साथ प्रयास किया)।

var pos = location.href.indexOf('c='); 
location = (pos < 0 ? 
        location + (location.href.indexOf('?') < 0 ? '?' : '&') 
        : location.href.substring(0, pos)) 
      + 'c=' + Math.floor(Math.random()*11) + '#' + comment_id ; 

असल में, मैं क्वेरी का लाभ उठाने ("?") स्ट्रिंग हैश के साथ पृष्ठ पुनः लोड को गति प्रदान करने। पहली पंक्ति क्या करती है यह जांचती है कि क्या हमारी "सुनहरा" क्वेरी स्ट्रिंग है (मैं "सी" चर का उपयोग करता हूं जो "टिप्पणी" के लिए खड़ा है)। यदि वहां है,

  1. नए यूआरएल में "सी =" से पहले सबकुछ होगा;
  2. फिर हमारे सुनहरे "सी =" + 0 और 10 + "#" + के बीच एक यादृच्छिक संख्या जोड़ता है + मेरी टिप्पणी आईडी जिसे ब्राउज़र को फिर से लोड करने पर कूदने की आवश्यकता होती है।

, यदि कोई

  1. नया URL सब कुछ पुराने किया करते थे यूआरएल होगा;
  2. यदि पुराने यूआरएल में पहले से ही कुछ अन्य क्वेरी स्ट्रिंग ("?" के बाद कुछ) है, तो एक क्वेरी एपेंड ऑपरेटर जोड़ें "&";
  3. यदि नहीं "?", तो इसे जोड़ें;
  4. फिर ऊपर उल्लिखित "सुनहरा" क्वेरी चला जाता है।

कारण "मैं" के बाद यादृच्छिक संख्या जोड़ता हूं यह है कि पहले रीलोड के बाद "? # टिप्पणी -10" जैसी कुछ है। इस मामले में, यूआरएल में अगला परिवर्तन पृष्ठ को फिर से लोड नहीं करेगा, क्योंकि ब्राउज़र इसे एंकर कूद निर्देश के रूप में समझता है।

पुनः लोड करने के लिए, हमें क्वेरी में कुछ यादृच्छिक चीज़ जोड़ने की आवश्यकता है ताकि नया यूआरएल पिछले से अलग हो।

यह समाधान सभी ब्राउज़रों पर काम करेगा और यह सुनिश्चित करेगा कि रीलोड मौजूदा क्वेरी को तोड़ नहीं देगा। केवल नोट यह सुनिश्चित करना है कि आपका "सुनहरा" क्वेरी चर नाम अद्वितीय है।

उम्मीद है कि इससे मदद मिलती है।

1

इस समस्या का सामना कर रहा था, जैसा कि उत्तर में से एक में सुझाव दिया गया था, यह मुद्दा केवल 302/301 पुनर्निर्देशन था। यदि पृष्ठ रीडायरेक्ट नहीं था तो हैश परिवर्तन पुनः लोड नहीं होता है। मैं PHP का उपयोग कर रीडायरेक्ट कर रहा था और पुनर्निर्देशन को रोकने के लिए कुकी का उपयोग नहीं करना चाहता था।

कुछ आईई 9 ब्राउज़र में भी इस मुद्दे पर अधिक था, 5 आईई 9 ब्राउज़र की कोशिश की, 4 पृष्ठ को फिर से लोड किया गया।

यहाँ एक ठीक सिर अनुभाग में इस जोड़ा है:

<!--[if lt IE 10]> 
    <script type="text/javascript"> 
     if(window.location.hash.replace('#','').length > 0 
      && window.location.hash.search('stopredirectioninie') == -1) 
     { 
      window.location.href = window.location.href+'&stopredirectioninie'; 
     } 
    </script> 
<![endif]--> 
0

हम एक ही समस्या थी।

हमारे मामले में इसमें एक http यूआरएल शामिल था जिसे अपाचे द्वारा https पर रीडायरेक्ट किया गया था। चूंकि हैश साइन के बाद स्ट्रिंग सर्वर को कभी नहीं पारित किया गया है, यह खो गया है।

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