详细讲解在JavaScript中获取当前页面完整URL及各组成部分的方法,深入剖析window.location对象的href、pathname、search、hash等核心属性与使用注意事项。
JS怎么获取当前页面URL?window.location属性详解
时间:2026-10-30
浏览:87
文章目录
在浏览器端 JavaScript 中,想要获取当前页面的完整 URL,最直接且标准的做法是读取 window.location.href,或者直接简写为 location.href。如果只需在控制台或简单脚本中输出整个地址,使用 window.location.href 就能立即拿到形如 "https://example.com/shop/item?id=102#detail" 的字符串。但在实际开发中,我们往往并不需要一整串原始地址,而是需要精确提取出协议、域名、路径、查询参数或者哈希锚点。window.location 对象本身就是一个结构化的 URL 解析器,掌握它的各项属性和行为逻辑,能够帮助我们在页面跳转、参数解析与状态管理中编写出更严谨的代码。
一、获取当前 URL 的三种常见写法与取舍
日常编码中,你可能会在不同项目中见到几种不同的获取方式。在深入剖析各子属性之前,先来辨析这三种写法在实际使用中的定位:
// 1. 最推荐的标准写法:明确获取字符串形式的完整 URL
const currentUrl1 = window.location.href;
// 2. 隐式类型转换写法:直接读取 location
const currentUrl2 = window.location.toString(); // 或 String(window.location)
// 3. 读取文档对象的 URL:等同于只读的当前地址
const currentUrl3 = document.URL;
这三种写法在现代浏览器中通常会得到相同的完整地址字符串,但在语义和安全性上略有差异:
window.location.href:返回值严格是只读字符串(在读取时),语义最直观,且在绝大多数编码规范与类型推导(如 TypeScript)中都最受推荐。- 直接读取
window.location:window.location本身是一个Location类型的特殊对象,并非纯字符串。如果直接将它赋值给普通变量(如const u = location),拿到的依然是对象引用,只有发生隐式转换或调用.toString()时才会变成字符串。 document.URL:这是 Document 接口提供的只读属性,它总是反映文档加载时的绝对 URL,不能通过对其赋值来触发页面导航。如果只是读取,它完全可用,但为了团队代码一致性,通常更偏向统一使用window.location。
二、拆解 URL:window.location 的核心属性结构
一个标准的统一资源定位符(URL)由多个逻辑段落拼接而成。window.location 对象自动完成了对当前 URL 的拆解,无需开发者手动书写复杂的正则表达式去截取各个部分。以下是一张典型的 URL 构成对照表:
| 属性名 | 含义 | 示例值(以 https://example.com:8080/shop/goods?id=12#reviews 为例) |
|---|---|---|
href |
完整的 URL 地址字符串 | "https://example.com:8080/shop/goods?id=12#reviews" |
protocol |
协议,包含末尾冒号 | "https:" 或 "http:" |
host |
主机名与端口号组合 | "example.com:8080"(若为默认端口则仅域名) |
hostname |
纯主机域名或 IP 地址 | "example.com" |
port |
端口号字符串 | "8080"(默认 80 或 443 时通常为空字符串 "") |
origin |
源(协议 + 域名 + 端口) | "https://example.com:8080" |
pathname |
资源路径部分,以斜杠开头 | "/shop/goods" |
search |
查询参数字符串,包含开头的问号 | "?id=12"(无参数时为空字符串 "") |
hash |
片段标识符(锚点),包含开头的井号 | "#reviews"(无锚点时为空字符串 "") |
为了直观建立每个属性与实际 URL 字段的对应关系,请参考下面的结构图解:
三、实操步骤:如何安全解析查询参数与路径
虽然 location.search 能够获取形如 "?id=12&sort=hot" 的问号串,但在早期的前端代码中,不少开发者会写复杂的 split('&') 或者正则去手工解析键值对。这种方法在遇到字符转义、空格被编码为 + 或特殊编码字符时极其容易出错。
现代浏览器已全面原生支持 URLSearchParams API,配合 location.search 是目前最规范、最简便的操作步骤。
完整实操代码示例
// 假设当前浏览器访问的 URL 是:
// https://example.com:3000/products/list?category=book&keyword=javascript#page-2
// 1. 获取完整地址
const fullUrl = window.location.href;
console.log("完整URL:", fullUrl);
// 2. 获取域名和端口
console.log("协议:", window.location.protocol); // 输出: "https:"
console.log("主机名:", window.location.hostname); // 输出: "example.com"
console.log("端口号:", window.location.port); // 输出: "3000"
console.log("源(Origin):", window.location.origin); // 输出: "https://example.com:3000"
// 3. 解析路径分段
const pathSegments = window.location.pathname.split('/').filter(Boolean);
console.log("路径分段数组:", pathSegments); // 输出: ["products", "list"]
// 4. 解析 Query 查询参数
const searchParams = new URLSearchParams(window.location.search);
const category = searchParams.get('category'); // 获取单个参数
const keyword = searchParams.get('keyword');
const notFound = searchParams.get('non_exist'); // 不存在时返回 null
console.log("分类:", category); // 输出: "book"
console.log("关键词:", keyword); // 输出: "javascript"
console.log("不存在的参数:", notFound); // 输出: null
// 5. 获取与更新 Hash 锚点
console.log("当前锚点:", window.location.hash); // 输出: "#page-2"
四、容易混淆的认知辨析
常见误区一:读取 location.port 随时都能拿到当前端口?
辨析:只有当访问地址中显式带上非默认端口号时(例如 :8080、:3000),location.port 才会返回数字字符串。如果访问的是标准 http://(默认 80 端口)或 https://(默认 443 端口),浏览器为了规范化统一,location.port 返回的是空字符串 "",而不是 "80" 或 "443"。在做网络请求拼接时,若需要兜底端口,应自行判断是否为空。
常见误区二:修改 window.location.href 和 window.location.replace() 效果完全一样?
辨析:虽然两者都会让页面跳转到新网址,但对浏览器历史记录栈的行为完全不同。直接对 location.href 赋值会把当前页面压入历史记录栈,用户点击浏览器的“后退”按钮可以回到跳转前的页面;而调用 location.replace(newUrl) 会直接覆盖掉当前这条历史记录,用户点击“后退”不会回到当前页。在登录成功重定向、支付拦截返回等避免循环跳转的场景下,replace() 是更好的选择。
五、知识总结:window.location 常用属性与方法全览
为了便于在日常开发中随时回顾与查阅,下图对 window.location 的所有读写属性及其自带的核心导航方法进行了系统性归纳:
六、注意事项与最佳实践
- Node.js 与服务端渲染(SSR)环境差异:
window.location属于浏览器全局对象BOM的一部分。在 Next.js、Nuxt.js 等服务端渲染框架的服务端阶段,执行window.location会直接抛出ReferenceError: window is not defined。在 SSR 项目中读取 URL 时,务必确保代码在useEffect/mounted等客户端生命周期中执行,或者先使用typeof window !== 'undefined'进行环境守卫。 - 修改属性触发的重定向:
window.location的大部分属性(如href、pathname、search)不仅支持读取,还支持写入。一旦为它们赋予新值,浏览器会立即触发页面卸载并重新导航(修改hash则仅滚动或触发hashchange事件,不重载页面)。因此在仅需提取信息时,请使用常量接收,避免意外赋错值引发页面死循环刷新。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。