JS学习——获取url参数值

623 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第7天,点击查看活动详情

前言

页面之间的通信传参是很常见的一种需求,在我们使用vue、react框架时,有好几种方法传递参数。有些时候我们需要通过url传参,比如iframe嵌入其他页面。这时候我们要能从url上面获取想要的参数值,下面我们就来讲解一下如何通过JS方法获取参数值。

url

url:统一资源定位符,简单来说就是用来搜索访问互联网上的资源。url由协议、域名等构成,具体构成如下: 协议+域名/ip地址+端口号+路径+参数

   'http://www.baidu.com/s?ie=UTF-8&wd=baidu'
   'http://10.0.3.128:39100/login?id:123456'
   //http为协议 一般是http或https https的安全性更高

路径后面拼接的就是参数,之间用来‘?’进行了连接,参数就跟后面,具体格式为: 参数1=参数1的值&参数2=参数2的值...
所以我们想要得到url上某个参数值就是获取等号后面的值

方法

明确了目的下一步就好办了,怎么获取呢?参数的格式都是固定的,当有多个的时候,我们要筛选确定,刚好数组当中有一个split方法——根据对应参数将字符串分割成数据,通过该方法组合成一个对象,就能得到我们想要的参数值;从另一个角度思考把url当成字符串,因为参数格式相对固定,所以我们可以利用正则匹配

数组split方法

在windo的lacation对象中有window.location.search可以获取‘?’及后面的内容,返回内容包含‘?’。我们可以利用该方法简化下操作,通过substr方法去掉‘?’,新建一个对象,通过split('&')进行分割得到数组,循环数组再通过split('=')分割组合成对象即可。具体代码如下:

    /**
     * @param string 参数名
     * @return string | string[] 参数值
    **/
    function getParams(name) {
      //获取拼接的参数
      const paramStr = window.location.search.substring(1);
      //第一次分割
      const paramsArr = paramStr.split('&');
      const obj = {};
      paramsArr.forEach((param) => {
        //第二次分割
        const paramArr = param.split('=');
        const pKey = paramArr[0];
        const pValue = paramArr[1];
        if (!obj[pKey]) {
          obj[pKey] = pValue;
        } else {
          //考虑下数组参数
          if (Array.isArray(obj[pKey])) {
            obj[pKey].push(pValue);
          } else {
            obj[pKey] = [obj[pKey], pValue];
          }
        }
      });
      return obj[name];
    }

正则

正则方法相对要简单的多,前提是我们要熟悉正则写法,根据参数拼接格式我们可以分析出正则匹配规则,以&或空开头+参数名+后面跟着'='直到下个'&'结束。

   function getParams(name) {
      const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
      const result = window.location.search.substr(1).match(reg);
      if (result != null) {
        return unescape(result[2]);
      }
      return null;
    }

以上就是JS获取url参数值的两种方法,JS方法稍显复杂点,url中有对应API可以帮助我们快速获取:

  • URLSearchParams用于处理url上的参数,通过.entries方法获取键值对。
   const search = new URLSearchParams("?a=1&b=2").entries();
   //转换为对象
   const params = Object.fromEntries(search) 
   console.log(params) // {a:1,b:2}

该方法需要注意兼容性,不支持IE11

总结

正则方法相对简单但我们要写对正则规则,split思路简单,但是操作复杂点,日常开发中我们可以直接选择URLSearchParams快速获取。