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

IT技术 javascript jquery url hash fragment-identifier
2021-02-02 19:52:14

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

6个回答

这是从这个查询字符串解析器修改的

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;
}

不需要 JQuery/插件

更新:

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

更新 (2019)

显然现在有一个 URLSearchParams 函数 - 请参阅@Berkant 的回答

对于基本处理,您的脚本很棒!!我们经常默认使用 jQuery 库来完成基本任务。谢谢!
2021-03-17 19:52:14
分号在正则r表达式中有什么作用?
2021-03-28 19:52:14
你能详细说明“哈希解析问题”吗?我有同样的需求,我认为您的回答没有任何问题。
2021-03-29 19:52:14
@Christophe- 老实说,我不记得了。我确定我的代码工作正常,但 BBQ 是一个完整的插件,包含 hashchange 事件、查询字符串解析等,所以可能这就是我的意思..
2021-04-06 19:52:14
Jquery BBQ 不再更新,并且与最新的 JQuery 有问题。
2021-04-08 19:52:14

使用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

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

此外,对于任何想要将解析的哈希作为对象的人来说: Object.fromEntries(parsedHash)
2021-03-17 19:52:14
这应该是最佳答案,而不是所有古老的答案。谢谢!
2021-03-27 19:52:14
同意。此外,对于多个参数,格式如您所料:a=foo&b=bar
2021-04-05 19:52:14

退房:jQuery BBQ

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

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

@Hovis- 这确实是一个很棒的插件,事实上我也已经改用它了。为您提供答案,因为它比我的刮擦功能要好得多。
2021-03-26 19:52:14
我要开始用这个了。
2021-03-31 19:52:14
BBQ 不适用于 Jquery 1.9+ 并在加载时引发异常。三年多没更新了。我不确定烧烤仍然是一个很好的推荐。您可以破解它以使其工作,请参阅:github.com/cowboy/jquery-bbq/pull/41
2021-04-07 19:52:14

在纯 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;
}, {});

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

变成

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

我收回“疯狂尝试......”评论!尝试实施某事是一种很好的学习方式。尽管已经 3 岁了,但这仍然是一个常见问题,而投票是我们整理知识的方式。目前你的答案被评为一个比大约URLSearchParams是我被downvoting试图解决这个问题。
2021-03-20 19:52:14
这不处理解码,例如#this=is+a+test加号应该转换为空格......还有其他十几种特殊情况。尝试自己实现这一点是很疯狂的。这是一个很常见的问题。
2021-04-07 19:52:14

我正在使用jQuery URL 解析器库。

这会解析 url 本身——而不是哈希项。有用,但不是原始问题的内容。
2021-04-09 19:52:14