JS如何取得URL里的参数?

本文介绍了如何使用JS高效地获取URL中的参数并将其转换为对象,详细阐述了解决思路、具体实现过程,包括处理特殊情况如重复参数名、数组参数等。同时,提供了不兼容IE的解决方案。

有一段时间没写过技术干货文了,这两天刚好遇到一个以前没太在意的一个功能实现–前端获取URL传递的参数

毕竟平时都是在后台处理,掉了一堆头发后,想想还是写出来跟你们分享一下,以后要是你们遇到了也有个参考

要只是获取一些常规字符串到没什么难的,关键还有些乱七八糟的需求,什么同一个参数名传递了多次啊,传数组啊。搞来搞去就写了一大堆

先说说思路吧,如果你看这文章是想要解决问题,拿着代码直接用的话,就直接看最后面的Code实现以及使用方法吧

用框架思维分析问题

给你一个如下的URL:

http://NaoNao.com/?product=shirt&color=blue&newuser&size=m#Hello

将URL里传递的参数转换为object对象,这样我们在使用参数的时候也更为方便

我曾多次强调框架思维,现在遇到这个问题了,我们就拿框架思维来分析一下,该怎样才能快速解决

首先是要了解我们的目的是什么?目的很简单,取得URL内传递的参数,并且解析成对象

接着再分析我们现在知道些什么?有一串URL

我们再来分析,如果从URL中获得传递的参数,也就是为了达到目的,我们该做些什么?

URL的特征我们大致都知道,就是第一个?后面的字符串,都是传递的参数,但是有个特殊情况请不要忘记了,URL后面有时候会带上一个#,而#后面的内容,并不是我们要传递的参数,而是网页位置的标识符

如果URL中包含了#我们只需要解析?#之间的字符串就可以了,如果不包含,那么第一个?后所有的内容都是我们需要解析的

你可能觉得我是在说废话,这么明显的事情,只要不是白痴都能看得懂

我当然知道,只要不是白痴都能看得懂,但我为什么要强调呢?因为我们想要快速的解决问题,必须具备框架思维,也可以说是工程思维

你可能有会说,这么简单的问题需要这样分析么?我们一看就知道了,闹闹你这是杀鸡用牛刀

虽说是杀鸡用牛刀,可要想培养自己的工程思维,那么必须保持刻意训练,直到随手拈来

好了,分析完后,我们按照上面的思路来逐步实现,实现的时候可能会遇到其它的问题,到时候再分析,再解决

毕竟再牛逼的工程师,也不会在动手前就想的面面俱到,只能是在动手实现前尽可能的考虑周到,遇到问题时再快速的迭代更新

JS获取URL参数的过程

先用JS拿到URL,如果函数传参了URL,那就用参数。如果没传参,就使用当前页面的URL

var queryString = url ? url.split('?')[1] : window.location.search.slice(1);

如果后面的字符串存在#,我们还得将#后面的字符串去掉,因为#后面的内容并不是我们需要获取的参数,而是网页位置的标识符

queryString = queryString.split('#')[0];

好了,把干扰的部分都移除后,我们可以开始安心的解析参数了,先将传递的参数分成数组

var arr = queryString.split('&');

现在我们可以获得一个字符串数组

['product=shirt', 'color=blue', 'newuser', 'size=m']

将字符串拆分成数组后,我们通过创建一个对象,用来存储我们所有的参数

var obj = {
   
   };

我们可以通过遍历数组arr,将它拆分成键值对。把这个字符串做成key:value的对象

var a = arr[i].split('=');

接下来就是要为每一个变量key分配对应的值value,如果我们得到的value不是一个正确的参数,我们就用true来表示这个参数名存在,当然了,你也可以根据自己的实际情况来做改变

var paramName = a[0];
var paramValue = typeof(a[1]) === 'undefined' ? true : a[1];

在这里我只是对undefined做了标记,如果是NaN,我是直接拿它当字符串处理了

在这里有一个小坑得提醒一下,我们在调用函数,获取对象取值的时候,如果URL传递的key为大写,我们取对象时写的小写,那么结果就是为undefined

比如URL为http://NaoNao.com/?NamE=NaoNao,如果不做大小写的处理,调用对象取值时getAllUrlParams().NamE才能取到值NaoNao,如果做了处理,我们使用时只需要全部写成小写/大写即可,例如

JavaScript 中解析 URL 参数有多种方式,取决于你是在浏览器环境中运行(如网页)还是在 Node.js 环境中运行。 下面我将分别给出两种环境下的解析方法,并附上详细代码和说明。 --- ### ✅ 方法一:在浏览器中使用 `URLSearchParams` 解析当前 URL 的查询参数 ```javascript // 获取当前 URL 的查询参数部分 const search = window.location.search || window.location.href.split('?')[1] || ''; // 使用 URLSearchParams 解析 const params = new URLSearchParams(search); // 获取参数值 const t = params.get('t'); // "1" const c = params.get('c'); // "2" const p = params.get('p'); // "9vvS0L9zPbr3" console.log({ t, c, p }); ``` #### ✅ 示例输入(URL): ``` https://click.meituan.com/t?t=1&c=2&p=9vvS0L9zPbr3 ``` #### ✅ 输出: ``` { t: "1", c: "2", p: "9vvS0L9zPbr3" } ``` #### 🔍 说明: - `URLSearchParams` 是浏览器内置 API,专门用于解析和操作查询字符串。 - `window.location.search` 获取的是 `?t=1&c=2&p=9vvS0L9zPbr3` 这部分。 - `.get('t')` 可以安全地获取某个参数值,如果参数不存在则返回 `null`。 --- ### ✅ 方法二:在 Node.js 环境中使用 `url` 模块解析 URL 参数 ```javascript const url = require('url'); const urlString = 'https://click.meituan.com/t?t=1&c=2&p=9vvS0L9zPbr3'; // 解析 URL const parsedUrl = url.parse(urlString, true); // 第二个参数为 true 表示自动解析 query // 获取查询参数对象 const { t, c, p } = parsedUrl.query; console.log({ t, c, p }); ``` #### ✅ 输出: ``` { t: '1', c: '2', p: '9vvS0L9zPbr3' } ``` #### 🔍 说明: - `url.parse(urlString, true)` 中的 `true` 表示将查询字符串解析为对象。 - `parsedUrl.query` 是一个包含所有参数的对象。 --- ### ✅ 封装函数:通用解析函数(适用于浏览器和 Node.js) ```javascript function getURLParams(url) { const search = url ? (url.split('?')[1] || '') : (window.location.search || ''); const params = new URLSearchParams(search); const result = {}; for (const [key, value] of params.entries()) { result[key] = value; } return result; } // 使用示例 const params = getURLParams('https://click.meituan.com/t?t=1&c=2&p=9vvS0L9zPbr3'); console.log(params); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值