我正面临着正确分割和解析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 = ...,它只是复制粘贴错误。
答案 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
。如果您只是通过键选择,那么您需要一些循环来检查每个键值对。