【问题标题】:Parsing URL hash/fragment identifier with JavaScript使用 JavaScript 解析 URL 哈希/片段标识符
【发布时间】:2011-05-11 00:02:02
【问题描述】:

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

【问题讨论】:

  • 你可以用一个非常简单的正则表达式来做到这一点。 URL 中的键/值对是什么“格式”?
  • 与查询字符串中的相同 - 请参阅我的答案

标签: javascript jquery url hash fragment-identifier


【解决方案1】:

在这里,修改自 query string parser:

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 plugin。它涵盖了所有哈希解析问题。

更新(2019 年)

显然现在有一个 URLSearchParams 函数 - 参见 @Berkant 的 answer

【讨论】:

  • 您能否详细说明“哈希解析问题”?我也有同样的需求,我看不出你的回答有什么问题。
  • @Christophe- 老实说我不记得了。我确信我的代码工作正常,但 BBQ 是一个包含 hashchange 事件、查询字符串解析等的总插件,所以可能这就是我的意思..
  • 对于基本处理,您的脚本非常棒!我们经常默认使用 jQuery 库来完成基本任务。谢谢!
  • r 正则表达式中的分号有什么作用?
  • Jquery BBQ 不再更新,最新的 JQuery 存在问题。
【解决方案2】:

使用URLSearchParams。浏览器覆盖率:https://caniuse.com/urlsearchparams。它在主要浏览器中得到完全支持。 Here 是一个 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 文档以查看接口的所有方法。

【讨论】:

  • 同意。此外,对于多个参数,格式如您所料:a=foo&b=bar
  • 这应该是最佳答案,而不是所有古老的答案。谢谢!
  • 另外,对于任何想要将解析后的哈希作为对象的人:Object.fromEntries(parsedHash)
【解决方案3】:

查看:jQuery BBQ

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

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

【讨论】:

  • @Hovis- 这确实是一个很棒的插件,事实上我也开始使用它了。给你答案,因为它是比我的临时功能更好的选择。
  • 我要开始使用这个了。
  • BBQ 不适用于 Jquery 1.9+ 并在加载时引发异常。它已经三年多没有更新了。我不确定烧烤是否仍然是一个很好的推荐。您可能可以破解它以使其工作,请参阅:github.com/cowboy/jquery-bbq/pull/41
【解决方案4】:

在纯 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'}

【讨论】:

  • 这不处理解码,例如#this=is+a+test 加号应该转换为空格......还有其他十几种特殊情况。尝试自己实现这一点很疯狂。这是一个常见的问题。
  • 我撤回了“疯狂尝试...”的评论!尝试实现某些东西是一种很好的学习方式。尽管已经 3 岁了,但这仍然是一个常见问题,并且投票是我们管理知识的方式。目前,您的答案被评为 高于 比关于 URLSearchParams 的答案,这是我试图通过投票解决的问题。
【解决方案5】:

我正在使用jQuery URL Parser 库。

【讨论】:

  • 这会解析 url 本身——而不是哈希项。有用,但不是最初的问题。
【解决方案6】:

我正在寻找这个问题的一堆答案,最后用reduce的一行将它们拼凑在一起:

const hashObj = location.hash.replace('#', '').split('&').reduce((prev, item) => Object.assign({[item.split('=')[0]]: item.split('=')[1]}, prev), {});

这一行显然发生了很多事情。为了清晰起见,可以这样重写:

const hashObj = location.hash.replace('#', '').split('&').reduce((prev, item) => {
  return Object.assign({[item.split('=')[0]]: item.split('=')[1]}, prev);
}, {});

【讨论】:

    【解决方案7】:

    我对@9​​87654321@ 的回答应该符合您的要求:

    url_args_decode = function (url) {
      var args_enc, el, i, nameval, ret;
      ret = {};
      // use the DOM to parse the URL via an 'a' element
      el = document.createElement("a");
      el.href = url;
      // strip off initial ? on search and split
      args_enc = el.search.substring(1).split('&');
      for (i = 0; i < args_enc.length; i++) {
        // convert + into space, split on =, and then decode 
        args_enc[i].replace(/\+/g, ' ');
        nameval = args_enc[i].split('=', 2);
        ret[decodeURIComponent(nameval[0])]=decodeURIComponent(nameval[1]);
      }
      return ret;
    };
    

    【讨论】:

      【解决方案8】:

      您还可以使用 .hash 属性,在此 scrolling table of contents 示例中演示的单击链接或 locatioin

      【讨论】:

        【解决方案9】:

        这个 jquery API 解析哈希标签:https://jhash.codeplex.com/

        // get the "name" querystring value
        var n = jHash.val('name');
        
        // get the "location" querystring value
        var l = jHash.val('location');
        
        // set some querystring values
        jHash.val({
            name: 'Chris',
            location: 'WI'
        });
        

        【讨论】:

        • 使用 gatoatigrado 的答案,比我发布的那个更好
        【解决方案10】:

        您可能想查看 jsuri。它似乎对我很有效。

        【讨论】:

        • 链接已失效。
        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 2016-02-13
        • 2012-09-13
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        相关资源
        最近更新 更多