拆分并解析window.location.hash

时间:2011-04-13 09:09:15

标签: javascript

我正面临着正确分割和解析window.location.hash的问题。

首先,我们在哈希中得到的参数很少,例如:

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

您肯定会看到它是为搜索而创建的。当用户点击分页链接页面时正在重新加载哈希。到目前为止一切都很好。

我创建了函数initialise(),每当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几乎正在工作......当我选择所有搜索参数时,哈希正在被削减。对于我不明原因。我试图使用if( params.indexOf('loc') )代替a[0] == "loc"而没有任何运气。

你可以帮我一把吗?

修改
当然,我在循环中使用var a = ...,它只是复制粘贴错误。

4 个答案:

答案 0 :(得分:35)

如果只是来自您之后的哈希的loc值,则不需要循环。这也应该有效。

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

关于页面重新加载后散列的切换:与你的循环无关的imho。

修改更现代,更准确的方法:

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>

答案 1 :(得分:9)

这应该是一种从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

然后,您可以使用

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

和哈希中可用的其他参数

答案 2 :(得分:2)

如果您使用的是jQuery,请查看jQuery BBQ plugin

它“利用HTML5 hashchange事件”,它基本上允许您在更改哈希后执行JavaScript代码。

此外,它附带了一个强大的“depram”函数,它允许您“从URL或当前window.location解析查询字符串,将其反序列化为对象,可选择强制数字,布尔值, null和undefined values。“

答案 3 :(得分:0)

params.indexOf('loc')不会返回值,因为loc数组中不存在params。您在提供的示例中查找的项目是loc=austria。如果您只是通过键选择,那么您需要一些循环来检查每个键值对。