2009-11-09 7 views
36

window.location.hash में यूआरएल भाग का एन्कोडेड या डीकोडेड प्रतिनिधित्व शामिल है?window.location.hash

जब मैं एक ही यूआरएल को खोलने (http://localhost/something/#%C3%BC जहां %C3%BCü करने के लिए अनुवाद) Firefox 3.5 और Internet Explorer 8 में, मैं document.location.hash के लिए अलग मान मिलता है:

  • IE8: #%C3%BC
  • FF3.5:

क्या दोनों ब्राउज़रों में एक संस्करण प्राप्त करने का कोई तरीका है?

उत्तर

37

दुर्भाग्य से, यह फ़ायरफ़ॉक्स में एक बग के रूप में यह location.hash एक अतिरिक्त समय डीकोड जब इस तक पहुंच है। उदाहरण के लिए, Firefox में इस प्रयास करें:

location.hash = "#%30"; 
location.hash === "#0"; // This is wrong, it should be "#%30" 

केवल पार ब्राउज़र समाधान सिर्फ हैश प्राप्त करने के लिए बजाय (location.href.split("#")[1] || "") उपयोग करने के लिए है। location.hash का उपयोग करके हैश सेट करना location.hash का समर्थन करने वाले सभी ब्राउज़रों के लिए सही ढंग से काम करता प्रतीत होता है।

+0

हाँ, यह सबसे उचित समाधान प्रतीत होता है। – Michael

+0

यह परीक्षण कम से कम फ़ायरफ़ॉक्स 10.0.1 के तहत 'झूठा' देता है। मुझे यकीन नहीं है कि यह कब बदल गया है, लेकिन निश्चित रूप से यदि आप पुराने संस्करणों का समर्थन करना चाहते हैं तो यह अभी भी सबसे अच्छी सलाह है। – hippietrail

+1

क्या होगा यदि हैश भाग में स्वयं # है? इस मामले में विभाजन विधि काम नहीं करेगा। – Christophe

0

वास्तव में फ़ायरफ़ॉक्स के अपने संस्करण (3.5 लिनक्स पर) में, अगर मैं URL में एक हैश, स्वयं URL के रूप में "#% C3% ई.पू." टाइप वास्तव में बदल देती है "# ü" के साथ यूनिकोड करने के लिए। लेकिन आप अपने स्वयं के प्रश्न का उत्तर देने के लिए प्रकट हुए हैं - फ़ायरफ़ॉक्स में, ब्राउजर यूआरएल में इकाई एस्केप कोड बदलता है, जबकि आईई में, यह नहीं करता है।

मेरी सलाह वास्तव में यह है: यूआरएल में "#% सी 3% बीसी" डालने के बजाय, बस अपने हैंश और यूआरएल में पूर्ण यूनिकोड का उपयोग करें। क्या यह एक विकल्प है? यह किसी भी आधुनिक ब्राउज़र में ठीक काम करना चाहिए।

+3

नहीं, यह नहीं है :(। आपका फ़ायरफ़ॉक्स (और मेरा भी) सिर्फ 'ü' चरित्र का उपयोग करने का नाटक कर रहा है। HTTP में यह हमेशा प्रतिशत-एन्कोडिंग का उपयोग करता है। अपने माउस को उस लिंक पर ले जाएं: http: // test /% सी 3% बीसी। फ़ायरफ़ॉक्स स्टेटस बार किसी कारण से 'ü' दिखाता है। लेकिन यदि आप एक HTTP स्निफर का उपयोग करते हैं, तो आप पाएंगे कि यह '% C3% BC' सबमिट कर रहा है। और मूल रूप से, क्योंकि मैं हूं HTTP रीडायरेक्ट में उस का उपयोग करके, मैं सीधे यूनिकोड वर्णों का उपयोग नहीं कर सकता। – Michael

+0

क्या आप सुनिश्चित हैं कि एएससीआईआई वी यूनिकोड एन्कोडिंग एन्कोडिंग पर निर्भर नहीं है? –

+0

AFAIK बिना किसी विशेष तैयारी के HTTP में यूनिकोड वर्णों को स्थानांतरित करने का कोई तरीका नहीं है प्रतिशत-एन्कोडिंग की तरह (क्योंकि HTTP ASCII रेंज के बाहर वर्णों की अनुमति नहीं देता है)। – Michael

1

आप decodeURIComponent उपयोग कर सकते हैं, यह सभी मामलों में वापस आ जाएगी:

decodeURIComponent('#%C3%BC'); // #ü 
decodeURIComponent('#ü'); // #ü 

इसे आजमाएं here

+2

कोई समाधान नहीं है क्योंकि: 'decodeURIComponent ('% 2540'); //% 40 (आईई) ' लेकिन ' decodeURIComponent ('% 40'); // @ (एफएफ) ' – Michael

+0

आपके मतलब के बारे में वास्तव में निश्चित नहीं है,% 2540'% 'वर्ण एनकोडेड ('% 25') और गैर एन्कोडेड '40' स्ट्रिंग, 'डीकोडुरिकॉम्पोनेंट ('% 40 ') है;' आईई या फ़ायरफ़ॉक्स में @ है http://jsbin.com/esafe – CMS

+4

मान लीजिए कि मैं एक खोज फ़ंक्शन के लिए हैश का उपयोग करना चाहता हूं और कोई '% 40' (लेकिन' @ 'के लिए नहीं) खोजना चाहता है। अपने ब्राउज़र के आधार पर, मुझे '#% 2540' (IE) या' #% 40' (एफएफ) 'location.hash' मिलेगा। यदि मैं इसे डीकोड करता हूं, तो मुझे विभिन्न ब्राउज़रों में अलग-अलग परिणाम मिलते हैं। – Michael

4

मेरे अपने प्रश्न का उत्तर देते हुए, मेरा वर्तमान समाधान window.location.hash का उपयोग करने के बजाय window.location.href को पार्स करना है, क्योंकि पूर्व हमेशा होता है (यानी हर ब्राउज़र में) url-encoded। इसलिए decodeURIComponent फ़ंक्शन सीएमएस प्रस्तावित हमेशा सुरक्षित रूप से उपयोग किया जा सकता है। YUI एक ही होता है, इसलिए यह है कि गलत नहीं हो सकता है ...

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