获取hash链接(hash片段)的参数

URL 结构:URL 由多个部分组成,包括协议(如 httphttps)、主机名(如 www.example.com)、端口号(可选,默认为 80 或 443)、路径(如 /path/to/page)、查询字符串(如 ?id=123&name=John)以及哈希片段(如 #section2)。

window.location.hash

通过 window.location.hash 属性来访问当前 URL 的哈希片段。这个属性返回包括 # 符号的哈希部分,例如 #section2

获取hash片段中的参数的方法
function getHashParams() {
    const hash = window.location.hash.substr(1); // 去掉开头的 #
    const params = {};

    if (hash) {
        const parts = hash.split('?'); // 以 ? 分割
        const path = parts[0]; // 获取路径部分
        params.path = path; // 存储路径

        if (parts.length > 1) {
            const queryString = parts[1]; // 获取查询参数部分
            const paramPairs = queryString.split('&');

            paramPairs.forEach(pair => {
                const [key, value] = pair.split('=');
                params[key] = decodeURIComponent(value || ''); // 解码参数值
            });
        }
    }

    return params;
}

const params = getHashParams();
console.log(window.location.hash); //URL 中的哈希链接
console.log(params.path); // 输出路径
console.log(params.id); // 输出 id 参数的值
console.log(params.name); // 输出 name 参数的值
例子
  1. 链接1:

    http://127.0.0.1:5500/hash.html#?id=2&name=winney
    

    输出结果:

    #?id=2&name=winney
    
    2
    winney
    
  2. 链接2:

    http://127.0.0.1:5500/hash.html#/?id=2&name=winney
    

    输出结果:

    #/?id=2&name=winney
    /
    2
    winney
    
  3. 链接3:

    http://127.0.0.1:5500/hash.html#/test/text.html?id=2&name=winney
    

    输出结果:

    #/test/text.html?id=2&name=winney
    /test/text.html
    2
    winney
    

注意:查询参数前需要加上?

getHashParams()方法适合以上3种情况的hash链接获取参数

如果不使用params.id这种方法获取参数对应的值,也可以使用解构赋值获取需要的参数:

const { id, name } = params;
根据参数名获取对应的值

getHashParams()方法是一次性返回全部参数。如果想通过传参数名来获取参数对应的值,可以给getHashParams()方法添加参数

/*
** @param paramName{string}    // 参数名
*/
function getHashParams(paramName) {
    const hash = window.location.hash.substr(1); // 去掉开头的 #
    const params = {};

    if (hash) {
        const parts = hash.split('?'); // 以 ? 分割
        const path = parts[0]; // 获取路径部分
        params.path = path; // 存储路径

        if (parts.length > 1) {
            const queryString = parts[1]; // 获取查询参数部分
            const paramPairs = queryString.split('&');

            paramPairs.forEach(pair => {
                const [key, value] = pair.split('=');
                params[key] = decodeURIComponent(value || ''); // 解码参数值
            });
        }
    }

    // 如果提供了参数名称,返回特定参数的值;否则返回所有参数
    if (paramName) {
        return params[paramName] || null; // 返回特定参数的值或 null(如果参数不存在)
    } else {
        return params;
    }
}

const id = getHashParams('id');
console.log(id); // 输出 id 参数的值
var params_all = getHashParams();
console.log(params_all); // 输出所有参数
const age = getHashParams('age');
console.log(age); // 输出 age 参数的值

链接:

http://127.0.0.1:5500/hash.html#/test/text.html?id=2&name=winney

结果:

2
{path: '/test/text.html', id: '2', name: 'winney'}
null
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值