<p>window.location.search 拿不到 hash 后的参数,因其只解析 # 前 ? 开始的查询字符串;hash 后参数需用 window.location.hash 解析或 this.$route.query(需确保路由为 hash 模式且参数位置正确)。</p>
为什么 window.location.search 拿不到 hash 后面的参数
因为 window.location.search 只读取 url 中 # 之前、? 开始的查询字符串。比如访问 https://example.com/#/?id=123&token=abc,window.location.search 是空字符串 —— 问号在 # 后面,浏览器根本不把它当查询参数处理。
真正属于 hash 路由的参数,必须从 window.location.hash 解析,或者交给 Vue Router(即 this.$route.query)统一管理。
-
window.location.hash返回完整 hash 字符串,例如"/?id=123&token=abc"或"/pages/detail?id=123" - 手动解析时注意:开头可能带
/,也可能带/?,需先截取有效部分再用URLSearchParams或正则处理 - 直接用
this.$route.query最省事,但前提是参数确实拼在 hash 路径的 query 部分(如#!/pages/detail?id=123),且路由已正确初始化
this.$route.query 拿不到值?检查这几个地方
常见现象是页面加载后 this.$route.query 为空对象,但 URL 明明带着参数。根本原因不是写法错,而是参数位置或生命周期时机不对。
- 确保参数写在
#后面、路径之后,例如https://example.com/#/pages/index?id=123,而不是https://example.com/?id=123#/ - 在
onLoad或onShow钩子中访问,不要在created或mounted里取 —— H5 端this.$route在页面实例创建时尚未同步完成 - 如果用了自定义重定向(比如从分享链接跳转),确认没有触发
uni.redirectTo或uni.reLaunch清掉了原始 hash 参数 - 检查
manifest.json中h5.router.mode是否仍为"hash";若误设为"history",this.$route.query将完全失效(此时参数应走window.location.search)
手动解析 window.location.hash 的安全写法
不依赖 Vue Router 时,最稳妥的方式是提取 hash 中的 query 部分并用 URLSearchParams 解析,避免手撕字符串出错。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
示例代码:
const hash = window.location.hash;
const queryStr = hash.split('?')[1] || '';
const params = new URLSearchParams(queryStr);
const id = params.get('id');
const token = params.get('token');
- 比正则更健壮,自动处理编码(如空格、中文)
- 兼容
#!/pages/detail?id=123&name=%E5%BC%A0%E4%B8%89这类带路径和编码的格式 - 注意:IE 不支持
URLSearchParams,如需兼容旧浏览器,得回退到正则或引入 polyfill - 别直接对整个
window.location.hash做decodeURIComponent—— 它可能包含路径段(如/pages/detail),解码会破坏斜杠
hash 模式下传参的两个典型陷阱
实际项目中最容易栽跟头的不是怎么取,而是怎么传、怎么拼。
- 分享链接里拼参数时,务必把
?放在#后面,例如:https://example.com/#/pages/share?channel=weixin&uid=789;写成https://example.com/?channel=weixin#/就会导致 H5 端无法通过this.$route.query获取 - 使用
uni.navigateTo跳转时,参数会自动序列化进路径,但如果你手动拼 URL(比如给web-view传 src),记得对参数值做encodeURIComponent,否则特殊字符(如&、=、空格)会破坏 query 结构 - 微信公众号内嵌 H5 有个硬限制:调用微信 JS-SDK 的
config接口时,location.href不能含#—— 所以必须用location.href.split('#')[0]截掉 hash 再签名,否则校验失败
hash 模式看着简单,但参数边界模糊、浏览器行为不一致、框架与原生 API 交界处容易漏判。关键不是“能不能取到”,而是“参数是否真到了 hash 路由该在的位置”。


















