如何在纯JavaScript中获取和设置URL哈希参数?
例如,我想像这样使用参数:myurl.com/#from=2012-01-05&to=2013-01-01
我想能够获取和设置上述from
和to
参数。
如果HTML5历史API是最好的方法,我很乐意使用它。
如何在纯JavaScript中获取和设置URL哈希参数?
例如,我想像这样使用参数:myurl.com/#from=2012-01-05&to=2013-01-01
我想能够获取和设置上述from
和to
参数。
如果HTML5历史API是最好的方法,我很乐意使用它。
如果您想解析哈希URL:
var hash = window.location.hash.substr(1);
var result = hash.split('&').reduce(function (res, item) {
var parts = item.split('=');
res[parts[0]] = parts[1];
return res;
}, {});
这样,如果你有以下内容:
http://example.com/#from=2012-01-05&to=2013-01-01
它会变成:{'from': '2012-01-05', 'to':'2013-01-01'}
如@Dean Stamler在评论中指出,不要忘记空对象:}, {});
现在来设置一个哈希 URL:
window.location.hash = "from=2012-01-05&to=2013-01-01";
{}
作为第二个参数包含在 reduce()
调用中。这是累加器的初始值。 - Dean Stamler您可以使用以下方式设置哈希值:
window.location.hash = "new value";
并且(在新版浏览器中),使用以下方式监听变化:
window.addEventListener("hashchange", function () {
});
如果你需要支持不支持 "hashchange"
的浏览器,你需要使用其他人编写的代码,例如 jQuery 历史记录插件。
location.hash
?(顺便说一下,通常是 window.
而不是 document.
) - Bergilocation.hash
得到了很好的支持,但是 "hashchange"
却没有。对于旧版本的 IE,你需要使用一个涉及 iframe 的 hack。请参见:http://caniuse.com/#search=hashchange - Halcyon关于获取参数...这个解决方案怎么样:
var myUrl = new URL(window.location.href.replace(/#/g,"?"));
var param_value = myUrl.searchParams.get("param_name");
祝你好运!
var myUrl = new URL('a://' + window.location.hash.replace(/^#/g,"?"))
(a://
只是最短的“有效”URL)。 - Lindsay-Needs-Sleep其他答案没有解决这个问题。
我有一个更简单的方法:
将当前的哈希参数复制到一个虚拟URL中作为搜索参数。现在您可以像对待搜索参数一样处理哈希参数,然后再将它们复制回来:
简单的函数
function setOrUpdateHashParameter( hashParameterName, hashParameterValue ) {
let theURL = new URL('https://dummy.com'); // create dummy url
theURL.search = window.location.hash.substring(1); // copy current hash-parameters without the '#' AS search-parameters
theURL.searchParams.set( hashParameterName, hashParameterValue ); // set or update value with the searchParams-API
window.location.hash = theURL.searchParams; // Write back as hashparameters
}
多个参数:
原始答案被翻译成“最初的回答”。const href = window.location.href;
const params = href.split('?')[1];
// Be sure url params exist
if (params && params !== '') {
const result = params.split('&').reduce(function (res, item) {
const parts = item.split('=');
res[parts[0]] = parts[1];
return res;
}, {});
}
href=https://www.example.net/page.html#/page1?foo=bar&token=123abc
时,result
将计算为 {foo: "bar", token: "123abc"}
。?
,在变量键和值之间有等号=
,并且在每个键/值对之间有一个&
。window.location.hash
,在应用 reduce
之前,我做了这个:decodeURI(window.location.hash).substr(1).split('&')
。 - Olga Bwww.example.com#word=foo&word=bar
。这是因为参数使用了相同的键(word
)吗? - Olga B?
将参数与其余部分分开。你也可以将 const params
中的 ?
替换为 #
。 - Christopher Chalfantarr = location.search.replace('?', '').split('&').map(x => x.split('=')).map(x => {
let keyName = x[0];
let val = x[1];
let object = {};
object[keyName] = val;
return object;
});
obj = {}
arr.forEach(function(x) {
let key = Object.keys(x)[0];
obj[key] = x[key];
});
console.log(obj);
[['term', 'hello'], ['lang', 'es']]
arr = "?safe=active&source=hp&ei=c4Q8XcOPFd3F5OUP7e242Ag&q=hola&oq=hola&gs_l=psy-ab.3..0l5j0i131j0l2j0i131j0.1324.1667..1798...1.0..0.264.744.1j3j1......0....1..gws-wiz.....10..35i39.-_FkFlX_Muw&ved=0ahUKEwiDlaTgytXjAhXdIrkGHe02DosQ4dUDCAU&uact=5".replace('?', '').split('&').map(x => x.split('=')).map(x => {
let keyName = x[0];
let val = x[1];
let object = {};
object[keyName] = val;
return object;
});
obj = {}
arr.forEach(function(x) {
let key = Object.keys(x)[0];
obj[key] = x[key];
});
console.log(obj);
在Maart的回答的基础上,这是一个返回编辑后URL而不是将更改应用于当前窗口的版本。
function setHashParam(url, name, value) {
// Create URL objects for the url we want to change and a dummy url (requires a polyfill for IE)
var urlObj = new URL(url);
var dummyObj = new URL('https://dummy.com');
// Copy current hash-parameters without the '#' as search-parameters
dummyObj.search = urlObj.hash.substring(1);
// Set or update value with the searchParams-API (requires a polyfill for IE)
dummyObj.searchParams.set(name, value);
// Write back as hashparameters
urlObj.hash = dummyObj.searchParams;
return urlObj.href;
}
location.search
查询的代码在location.hash
上。 - Bergi?from=X&to=Y
。是的,完全正确,谢谢。 - Richard