JavaScript获取URL参数常见的4种方法

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~

💟 作 者:码喽的自我修养🥰
📝 专 栏:JavaScript深入研究 🎉

🌈 创作不易,如果能帮助到带大家,欢迎 收藏+关注💕

JavaScript获取URL参数常见的4种方法

在前端开发中,处理URL参数是一个常见的任务,尤其是在没有框架支持的情况下。虽然许多框架提供了方便的方法来获取URL参数,但有时我们需要依赖原生JavaScript来完成这个任务。这也是面试中经常出现的问题之一。今天让我们一起来探讨如何利用原生JavaScript来获取URL参数值。

JavaScript获取URL参数常见的4种方法

原生JS获取URL链接参数的方法有好几种,我们一起来学习一下常见的几种

1.使用正则表达式

2.利用a标签内置方法

3.利用split分割方法

4.使用URLSearchParams方法

方法一: 正则表达式

```javascript
function queryURLParams(url, paramName) {
    // 正则表达式模式,用于匹配URL中的参数部分。正则表达式的含义是匹配不包含 ?、&、= 的字符作为参数名,之后是等号和不包含 & 的字符作为参数值
    let pattern = /([^?&=]+)=([^&]+)/g;
    let params = {};

    // match用于存储正则匹配的结果
    let match;
    // while 循环和正则表达式 exec 方法来迭代匹配URL中的参数
    while ((match = pattern.exec(url)) !== null) {
        // 在字符串url中循环匹配pattern,并对每个匹配项进行解码操作,将解码后的键和值分别存储在key和value变量中
        let key = decodeURIComponent(match[1]);
        let value = decodeURIComponent(match[2]);

        if (params[key]) {
            if (Array.isArray(params[key])) {
                params[key].push(value);
            } else {
                params[key] = [params[key], value];
            }
        } else {
            // 参数名在 params 对象中不存在,将该参数名和对应的值添加到 params 对象中
            params[key] = value;
        }
    }

    if (!paramName) {
        // 没有传入参数名称, 返回含有所有参数的对象params
        return params;
    } else {
        if (params[paramName]) {
            return params[paramName];
        } else {
            return '';
        }
    }
}

let url = "http://www.baidu.com?name=elephant&age=25&sex=male&num=100&name=lion";
console.log(queryURLParams(url)); // 返回所有参数对象
console.log(queryURLParams(url, 'name')); // 返回参数名为 'name' 的所有值
console.log(queryURLParams(url, 'age')); // 返回参数名为 'age' 的值
console.log(queryURLParams(url, 'color')); // 返回""
```

正则表达式解释:

  • ([^? &=]+):这部分是一个捕获组,表示匹配不包含?&= 的任意字符的一个或多个,即匹配参数名部分。
  • = :表示匹配参数名和参数值之间的等号。
  • ([^ &]+):这部分也是一个捕获组,表示匹配不包含& 的任意字符的一个或多个,即匹配参数值部分。
  • g :表示使用全局匹配模式,即匹配目标字符串中所有符合模式的部分。

方法二: 利用a标签

a标签内置的方法能够快速且方便地获取URL参数,

它的原理主要就是利用了a标签得到一些内置属性,如href、hash、search等属性。

考虑到URL中的哈希部分,在函数queryURLParams(url) 中,会检查URL中的哈希部分是否存在,如果存在则将哈希值存储到参数对象中,并将属性名设置为"HASH"。这样在返回的参数对象中,如果URL中有哈希部分,就可以通过"HASH"来访问哈希值。

```javascript
let URL = "http://www.baidu.com?name=elephant&age=25&sex=male&num=100#smallpig"
  function queryURLParams(url) {
    // 1.创建a标签
    let link = document.createElement('a');
    link.href = url;
    let searchUrl = link.search.substr(1); // 获取问号后面字符串
    let hashUrl = link.hash.substr(1); // 获取#后面的值
    let obj = {}; // 声明参数对象
    // 2.向对象中进行存储
    hashUrl ? obj['HASH'] = hashUrl : null; // #后面是否有值

    let list = searchUrl.split("&");
    for (let i = 0; i < list.length; i++) {
      let arr = list[i].split("=");
      obj[arr[0]] = arr[1];
    }
    return obj;
  }
  console.log(queryURLParams(URL))
```

上段代码中先创建了一个a标签,然后就可以根据a标签的属性分别得到url的各个部分了,这其实和Vue的路由跳转获取参数有点类似。

1. 将传入的URL赋值给 标签的 href 属性的目的是利用浏览器提供的原生 API 来帮助实现 URL 参数的解析。通过将URL赋值给 标签的 href 属性,浏览器会自动解析这个URL,包括提取其中的协议、主机、路径、查询参数等各个部分,从而方便我们对这个URL进行进一步的操作。

2. 通过link.search.substr(1)link.hash.substr(1)可以获取URL中问号后面的字符串和#后面的值,是因为浏览器在解析URL后会将这些信息存储在标签对象的对应属性中。具体来说:

- link.search 包含了 URL 中问号后面的部分(即查询参数部分)。

- link.hash 包含了 URL 中#后面的部分(即片段部分)。

- 使用substr(1)是为了去掉字符串中的问号或#字符,只留下真正的参数内容或片段内容。

方法三: split分割法

这种方法利用了split可以以某个字符讲字符串分割为数组的特点,巧妙地将各个参数分割出来。

```javascript
function getUrlParams(url, paramName) {
    // 从 URL 中提取查询参数部分
    const queryString = url.split('?')[1];

    // 如果没有查询参数,返回空对象
    if (!queryString) {
        return {};
    }

    // 处理带有 hash 地址的情况
    const hashIndex = queryString.indexOf('#');
    if (hashIndex !== -1) {
        queryString = queryString.substring(0, hashIndex);
    }

    // 将查询参数字符串解析为键值对
    const queryParams = {};
    queryString.split('&').forEach(param => {
        const [key, value] = param.split('=');
        // 如果值已经存在,则将其转换为数组存储
        if (queryParams[key]) {
            if (Array.isArray(queryParams[key])) {
                queryParams[key].push(decodeURIComponent(value));
            } else {
                queryParams[key] = [queryParams[key], decodeURIComponent(value)];
            }
        } else {
            queryParams[key] = decodeURIComponent(value);
        }
    });

    // 如果没有指定参数名称,则返回包含所有查询参数的对象
    if (!paramName) {
        return queryParams;
    }

    // 如果指定了参数名称
    if (queryParams[paramName]) {
        return queryParams[paramName];
    } else {
        // 参数不存在,返回空字符串
        return '';
    }
}

// 示例 URL
const url = 'https://example.com?name=John&age=30&name=Jane&gender=male';
const urlWithHash = 'http://xxx.com/#/operations/app?name=John&age=30&name=Jane&gender=male';

console.log(getUrlParams(url)); 
// 输出: { name: ['John', 'Jane'], age: '30', gender: 'male' }

console.log(getUrlParams(url, 'name'));
// 输出: ['John', 'Jane']

console.log(getUrlParams(url, 'age'));
// 输出: '30'

console.log(getUrlParams(url, 'city'));
// 输出: ''

console.log(getUrlParams(urlWithHash)); 
// 输出: { name: ['John', 'Jane'], age: '30', gender: 'male' }

```
关于hash地址部分

在处理 URL 查询参数时,通常情况下不需要处理 hash 地址部分。

Hash 地址通常用于客户端路由或页面内导航,一般不会包含查询参数信息。

但在某些情况下,可能需要处理带有 hash 地址的 URL,例如:

1. 当需要从 URL 中提取查询参数时,如果 URL 中的查询参数部分后面紧跟着 hash 地址(如 http://example.com/page?name=John#section2),需要排除 hash 部分以确保正确提取查询参数。

2. 如果要监听 hash 地址的变化,并根据不同的 hash 地址执行不同的逻辑(如单页面应用路由器),则需要处理 hash 地址的改变并做出响应。 总的来说,在处理 URL 查询参数时一般不需要处理 hash 地址部分,但在特定情况下需要注意并处理。

方法四: URLSearchParams

URLSearchParams方法能够让我们非常方便的获取URL参数,但是存在一定的兼容性问题,官网的解释如下:

URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。

该接口提供了非常的的方法让我们来处理URL参数,这里我们只介绍如何获取URL参数值,更加详细的使用方法大家可以参考官网。

```javascript
 let URL = "http://www.baidu.com?name=elephant&age=25&sex=male&num=100"
  function queryURLParams(URL) {
    let url = URL.split("?")[1];
    const urlSearchParams = new URLSearchParams(url);
    const params = Object.fromEntries(urlSearchParams.entries());
    return params
  }
  console.log(queryURLParams(URL))
```

这里我们基本上只用了两行主要代码就实现了参数的解析。需要注意的是urlSearchParams.entries()返回的是一个迭代协议iterator,所以我们需要利用Object.fromEntries()方法将把键值对列表转换为一个对象。

关于迭代协议,大家可以参考官网:迭代协议icon-default.png?t=O83Ahttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols

总结:

这里介绍了四种方法来实现URL链接参数值的解析,其中使用最为广泛的应该当属split分割法。总的来说,了解和掌握这些方法可以帮助前端开发者更有效地处理URL参数,从而提升开发效率和应对面试中可能出现的相关问题。

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易 ,如果能帮助到大家,希望大家点点 收藏+关注 ~💕

JavaScript获取URL参数常见的4种方法

更多专栏订阅推荐:

🥕 JavaScript深入研究

👍 前端工程搭建
💕 vue从基础到起飞

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战

JavaScript获取URL参数常见的4种方法

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5290.html

(0)
LomuLomu
上一篇 2025 年 1 月 6 日
下一篇 2025 年 1 月 6 日

相关推荐

  • JAVA 图形界面编程 AWT篇(1)

    前言 为了应对JAVA课设,小编走上了java的图形界面编程的道路,通过博客分享自己的学习历程,并进行笔记的记录。 AWT(Abstract Window Toolkit)介绍 AWT(抽象窗口工具包)是 Java 最早的图形用户界面(GUI)框架之一,主要用于构建桌面应用程序的图形界面。最初在 JDK 1.0 版本中作为 Java GUI 的核心库引入,旨…

    未分类 2024 年 12 月 30 日
    49100
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

    目录 一、ThreadLocal基本知识回顾分析 (一)ThreadLocal原理 (二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null? (三)ThreadLocal中的内存泄漏问题及JDK处理方法 (四)部分核心源码回顾 ThreadLocal.set()方法源码详解 ThreadLocalMap.get()方法详解 Th…

    2024 年 12 月 30 日
    54500
  • 微软开源!Office 文档轻松转 Markdown!

    大家好,我是 Java陈序员。 今天,给大家介绍一款微软开源的文档转 Markdown 工具。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 MarkItDown —— 微软开源的 Python 工具,能够将多种常见的文件格式(如 PDF、PowerPoint、Word、Excel、图像、音频…

    2025 年 1 月 10 日
    48800
  • 【深度学习】Java DL4J基于多层感知机(MLP)构建公共交通优化模型

    # 博主简介:技术领域的探索者 我是CSDN博客专家,同时也是历代文学网的总架构师。拥有15年的丰富工作经验,我精通Java编程、高并发设计、Springboot以及微服务架构。此外,我还熟悉Linux操作系统、ESXI虚拟化技术,以及云原生技术栈中的Docker和Kubernetes。我热衷于不断探索科技的前沿,将抽象的理论知识转化为实际的解决方案。我保持…

    未分类 2024 年 12 月 28 日
    41100
  • 【Java 学习】详讲代码块:控制流语句代码块、方法代码块、实例代码块(构造代码块)、静态代码块、同步代码块

    💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持! 🚀 传播技术之美:期待您将这篇文章推荐给更多对需要学习Java语言、低代码开发感兴趣的朋友,让我们共同学习、成长! 1. 什么是代码块? 在学习各种语言的时候,有些语句需要使用{}将代码围起来,有…

    2025 年 1 月 17 日
    68700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信