2011-04-13 10 views
12

मुझे splitting और पार्सिंग window.location.hash सही ढंग से समस्याएं आ रही हैं।स्प्लिट और पार्स window.location.hash

सबसे पहले, हम हैश में कुछ मानकों, पूर्व मिलती है:

#loc=austria&mr=1&min=10&max=89 

आप निश्चित रूप से देखने के रूप में यह खोज के लिए बनाया गया है। जब उपयोगकर्ता पेजिनेशन लिंक पेज पर क्लिक करता है तो हैश के साथ पुनः लोड किया जा रहा है। अब तक सब ठीक है।

मैं समारोह आरंभ() है कि हर बार जब वहाँ URL में हैश है बुला रहा है बनाया:

if (window.location.hash) { 
    var params = (window.location.hash.substr(1)).split("&"); 

    for (i = 0; i < params.length; i++) 
    { 
     var a = params[i].split("="); 
     // Now every parameter from the hash is beind handled this way 
     if (a[0] == "loc") 
     { 
      locationList(a[1]); 
     } 
    } 
} 

Everythig लगभग काम कर रहा है ... जब मैं चुनें सभी खोज पैरामीटर हैश किया जा रहा है ... कटौती। मेरे लिए अज्ञात कारण के लिए। मैंने बिना किसी किस्मत के a[0] == "loc" के बजाय if(params.indexOf('loc')) का उपयोग करने का प्रयास किया।

क्या आप मुझे हाथ उधार दे सकते हैं?

संपादित
बेशक , मैं वर एक उपयोग कर रहा था = ... पाश में, यह केवल कॉपी-पेस्ट त्रुटि थी।

+0

* जब मैं सभी खोज पैरामीटर हैश किया जा रहा है ... कटौती चुनें * हैश के अंदर उपलब्ध हैं इस्तेमाल कर सकते हैं। मैं इस वाक्य को समझ नहीं पा रहा हूं ... –

+0

जब मेरे पास हैश को इस '# loc = austria और mr = 1 और min = 10 और max = 89' जैसे पृष्ठ को पुनः लोड करने के बाद है, तो यह '# loc = austria और mr = 1' है। – user948438237

+0

क्या आपने कोशिश की है 'अगर (पैरा] [i] .indexOf (' loc ')) '?? –

उत्तर

25

आपको लूप की आवश्यकता नहीं है, अगर यह केवल हैश से loc का मान है। यह भी काम करना चाहिए।

var lochash = location.hash.substr(1), 
    mylocation = lochash.substr(lochash.indexOf('loc=')) 
        .split('&')[0] 
        .split('=')[1]; 
if (mylocation) { 
    locationList(myLocation); 
} 

एक पृष्ठ पुनः लोड के बाद हैश के trunctating के संबंध में: imho कि अपने पाश से संबंधित नहीं है।

संपादित एक और अधिक आधुनिक और अधिक सटीक दृष्टिकोण:

const result = document.querySelector("#result"); 
 
const hash2Obj = "loc=austria&mr=1&min=10&max=89" 
 
     .split("&") 
 
     .map(el => el.split("=")) 
 
     .reduce((pre, cur) => { pre[cur[0]] = cur[1]; return pre; }, {}); 
 

 
result.textContent += `loc => ${hash2Obj.loc} 
 
---- 
 
*hash2Obj (stringified): 
 
${JSON.stringify(hash2Obj, null, ' ')}`;
<pre id="result"></pre>

+0

आप सही हैं। अब मुझे एहसास हुआ कि मेरे पास एक तार्किक त्रुटि है (हैश बिल्ड होने पर भी buildRequestHash() फ़ंक्शन को कॉल करना)। धन्यवाद। – user948438237

+0

तकनीकी रूप से, आपके पास मामूली बग है यदि '=' का उपयोग मूल्य स्ट्रिंग में अनचाहे किया जाता है ... "# key1 = foo = bar, alloc = true & loc = ..." के बारे में सोचें। एक बड़ा सौदा नहीं, बस कुछ मैंने अंदर घुमाया। चीयर्स! –

+0

'# bloc = thing' – Hugo

0

params.indexOf('loc')loc के रूप में कोई मान वापस नहीं करेगा params सरणी के भीतर मौजूद नहीं है। प्रदान की गई वस्तु में जो आइटम आप खोज रहे हैं वह loc=austria है। यदि आप केवल कुंजी द्वारा चयन कर रहे हैं तो आपको प्रत्येक कुंजी-मूल्य जोड़ी की जांच करने के लिए कुछ लूपिंग की आवश्यकता होगी।

1

आप jQuery का उपयोग कर रहे हैं, तो jQuery BBQ plugin

की जाँच यह "एचटीएमएल 5 hashchange घटना का लाभ उठाता है ", जो मूल रूप से हैश बदल दिए जाने के बाद आपको जावास्क्रिप्ट कोड निष्पादित करने की अनुमति देता है।

Furthemore, यह एक शक्तिशाली "depram" समारोह है, जो आप "एक URL या वर्तमान विंडो स्थान से क्वेरी स्ट्रिंग पार्स करने, एक वस्तु में deserializing, वैकल्पिक रूप से मजबूर नंबर, बूलियन्स, अशक्त और अपरिभाषित की अनुमति देता है के साथ आता है मान। "

2

यह स्थान से पढ़ने के लिए एक आसान तरीका होना चाहिए।हैश:

var hash = window.location.hash.substring(1); 
    var params = {} 
    hash.split('&').map(hk => { 
     let temp = hk.split('='); 
     params[temp[0]] = temp[1] 
    }); 
    console.log(params); //Here are the params to use 

और उसके बाद, आप

params.access_token //access_token 
params.id //id 

और अन्य पैरामीटर है कि

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