使用JavaScript解析URL哈希/片段标识符

Yar*_*rin 44 javascript url hash jquery fragment-identifier

寻找一种方法,使用JavaScript/JQuery将URL的哈希/片段中的密钥对解析为对象/关联数组

Yar*_*rin 51

在这里,从这个查询字符串解析器修改:

function getHashParams() {

    var hashParams = {};
    var e,
        a = /\+/g,  // Regex for replacing addition symbol with a space
        r = /([^&;=]+)=?([^&;]*)/g,
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
        q = window.location.hash.substring(1);

    while (e = r.exec(q))
       hashParams[d(e[1])] = d(e[2]);

    return hashParams;
}
Run Code Online (Sandbox Code Playgroud)

不需要JQuery /插件

更新:

我现在按照Hovis的回答推荐jQuery BBQ插件.它涵盖了所有哈希解析问题.

  • 你能详细说明"散列解析问题"吗?我有同样的需求,我认为你的答案没有错. (9认同)
  • 对于基本处理,你的脚本真棒!我们常常默认使用jQuery库来完成基本任务.谢谢! (2认同)

Hov*_*dle 31

退房:jQuery BBQ

jQuery BBQ设计用于从url(查询字符串或片段)解析事物,并且更加简化基于片段的历史记录.这是Yarin在他整理一个纯粹的js解决方案之前所寻找的jQuery插件.具体来说,deparam.fragment()函数可以完成这项工作.看一看!

(我正在研究的支持网站使用异步搜索,因为BBQ使得将整个对象整合到片段中变得微不足道,我使用它来"保留"我的搜索参数.这为我的用户提供了他们搜索的历史状态,以及允许他们为有用的搜索添加书签.最重要的是,当QA发现搜索缺陷时,他们可以直接链接到有问题的结果!)

  • 烧烤与Jquery 1.9+不兼容,并在加载时抛出异常.三年多来一直没有更新.我不确定烧烤是不是一个好建议.您可以破解它以使其工作,请参阅:https://github.com/cowboy/jquery-bbq/pull/41 (6认同)

Ber*_*ant 31

使用URLSearchParams。浏览器覆盖范围:https : //caniuse.com/urlsearchparams。主要浏览器完全支持它。如果您需要在不受支持的浏览器上使用它,这里有一个 polyfill。

如何读取一个简单的密钥:

// window.location.hash = "#any_hash_key=any_value"

const parsedHash = new URLSearchParams(
  window.location.hash.substr(1) // skip the first char (#)
);

console.log(parsedHash.get("any_hash_key")); // any_value
Run Code Online (Sandbox Code Playgroud)

查看我在上面链接的 Mozilla 文档以查看接口的所有方法。

  • 另外,对于任何想要将解析的哈希作为对象的人:`Object.fromEntries(parsedHash)` (3认同)
  • 这应该是最重要的答案,而不是所有古老的答案。谢谢! (2认同)

paq*_*mez 18

在纯Javascript中执行此操作:

var hash = window.location.hash.substr(1);

var result = hash.split('&').reduce(function (result, item) {
    var parts = item.split('=');
    result[parts[0]] = parts[1];
    return result;
}, {});
Run Code Online (Sandbox Code Playgroud)

http://example.com/#from=2012-01-05&to=2013-01-01

{from: '2012-01-05', to:'2013-01-01'}

  • 我撤回“疯狂尝试...”的评论!尝试实施某件事是一种很好的学习方式。尽管已经有 3 年历史了,但这仍然是一个常见问题,而投票是我们管理知识的方式。目前,您的答案的评级*高于*关于“URLSearchParams”的答案,这是我试图通过投票来解决的问题。 (2认同)