JavaScript:从具有使用 # 符号的路由的 URL 获取查询字符串

JavaScript: Get query string from URL with routing that uses # sign

本文关键字:路由 URL 获取 字符串 查询 符号 JavaScript      更新时间:2023-09-26

我在我的应用程序中使用了Ext JS的路由,但这是一个更基本的问题......只要知道 Ext JS 中的路由设置得像 http://url/#area1/subarea1 一样,#area1 会将我带到父级别区域,子区域 1 会将我带到区域 1 的第一个子项。

无论如何,我正在尝试完成的是将查询参数添加到我的 URL 中......所以它会像 http://url/#area1/subarea1?startDate=03/03/2014&isDraft=true ,但看起来 location.search 在 FF 和 Chrome 中都是一个空字符串,所以我假设这是设计使然。 我知道我可以解析 location.href,但这似乎很愚蠢。 我基本上想知道我是否做错了什么,或者是否有其他属性可以使用?

位置 URL 始终具有以下顺序:协议主机名路径名搜索哈希。在您的情况下,搜索为空,因为#在第一个?之前。

所以,在http://url/#area1/subarea1?startDate=03/03/2014&isDraft=true

  • location.protocol http:
  • location.hostname url
  • location.pathname /
  • location.search为空
  • location.hash #area1/subarea1?startDate=03/03/2014&isDraft=true

因此,location.hash.split('?')[1]应该包含所需的"查询参数",或者如果您希望它们作为对象,Ext.Object.fromQueryString(location.hash.split('?')[1] || {}) .

我刚刚在 Angular 中遇到了同样的问题。这是我的解决方案:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    url = url.toLowerCase(); 
    name = name.replace(/['[']]/g, "''$&").toLowerCase();
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/'+/g, " "));
}