我希望在哈希之后在URI中存储键/值对,以便在客户端使用,如下所示:
http://www.foo.com/index.html#foo=bar&baz=quux
是否有预先存在的解决方案已经执行此操作或应该自行滚动?我已经在使用JQuery了,所以特别欢迎JQuery解决方案。
我最初的想法是使用正则表达式,但这很复杂,尤其是当你需要转义键和值时。
编辑:让我澄清一下。我想做这样的事情:foo = hash.get('foo');
hash.set('bar','baz');
答案 0 :(得分:8)
对于任何有兴趣的人,这是我提出的解决方案:
/**
* Copyright 2009 by David Kerkeslager
* Released under the BSD License (http://davidkerkeslager.com/license.txt).
*
* This library defines an object-literal which allows one to store key/value pairs after the hash (#) in the URI.
* The syntax of the storage is modeled after the way that GET variables are stored after the question mark (?) in
* the URI.
*
* Example URI: "http://www.foo.com/index.html#foo=bar&baz=quux"
*
* Note: it should be obvious that this should not be used for storing private data of any kind.
*/
var URIHash =
{
/**
* Dump the contents of the URI hash into an associative array. If the hash is invalid, the method returns
* undefined.
*/
dump : function()
{
var hash = document.location.hash;
var dump = new Array();
if(hash.length == 0) return dump;
hash = hash.substring(1).split('&');
for(var key in hash)
{
var pair = hash[key].split('=');
if(pair.length != 2 || pair[0] in dump)
return undefined;
// escape for storage
dump[unescape(pair[0])] = unescape(pair[1]);
}
return dump;
},
/**
* Takes an associative array and stores it in the URI as a hash after the # prefix, replacing any pre-
* existing hash.
*/
load : function(array)
{
var first = true;
var hash = '';
for(var key in array)
{
if(!first) hash += '&';
hash += escape(key) + '=' + escape(array[key]);
}
document.location.hash = hash;
},
/**
* Get the value of a key from the hash. If the hash does not contain the key or the hash is invalid,
* the function returns undefined.
*/
get : function(key)
{
return this.dump()[key];
},
/**
* Set the value of a key in the hash. If the key does not exist, the key/value pair is added.
*/
set : function(key,value)
{
var dump = this.dump();
dump[key] = value;
var hash = new Array();
for(var key in dump)
hash.push(escape(key) + '=' + escape(dump[key]));
document.location.hash = hash.join('&');
}
}
答案 1 :(得分:1)
您可以在哈希之后存储JSON数据。我一直在研究这样做 - 它可以避免解析,尽管你可能会篡改自己。
答案 2 :(得分:0)
Ben Alman的JQuery Hashchange插件在同一页面上为多个小部件设置哈希参数。它还允许旧版浏览器通过哈希更改进行备份。
答案 3 :(得分:0)
今天,可以使用URLSearchParams
完成所有这些操作假设网址为http://www.foo.com/index.html#foo=bar&baz=quux
,
const hash = window.location.hash.slice(1)
searchParams = new URLSearchParams(hash)
searchParams.get("foo") //=> "bar"
searchParams.set("waldo", "fred")
searchParams.toString() //=> "foo=bar&baz=quux&waldo=fred"