开发者

Split and parse window.location.hash

I'm facing issues with splitting and parsing window.location.hash correctly.

First of all, we get few parameters in hash, ex:

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

As you surely see it's been created for search. When user clicks on pagination link page is being reloaded with the hash. So far so good.

I 开发者_JAVA百科created function initialise() that is calling every time when there's hash in the 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 is almost working... When I choose all search params hash is being... cut. For unknown reason for me. I tried to use if( params.indexOf('loc') ) instead of a[0] == "loc" without any luck.

Could you lend me a hand?

Edit

Of course, I was using var a = ... in the loop, it was only copy-paste error.


You don't need a loop, if it's only the value of loc from the hash you're after. This should also work.

var lochash    = location.hash.substr(1),
    mylocation = lochash.substr(lochash.search(/(?<=^|&)loc=/))
                  .split('&')[0]
                  .split('=')[1];
if (mylocation) {
   locationList(myLocation);
}

Concerning the trunctating of the hash after a page reload: imho that isn't related to your loop.

Edit A more modern and more accurate approach:

const result = document.querySelector("#result");
const hash2Obj = "loc=austria&mr=1&min=10&max=89"
      .split("&")
      .map(v => v.split("="))
      .reduce( (pre, [key, value]) => ({ ...pre, [key]: value }), {} );
          

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


This should be a rather simpler way to read from location.hash:

    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

and then, you could use

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

and other params that are available inside the hash


params.indexOf('loc') will not return a value as loc does not exist within the params array. The item that you are looking for in the example provided is loc=austria. If you are only selecting by the key then you would need some looping to examine each key-value pair.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜