URL参数必须用encodeURIComponent()单独编码,避免截断或解析错乱;推荐URLSearchParams处理编解码;跳转用location.replace()防脏历史;接收端禁用手撕search,超长敏感数据勿塞URL。

URL参数必须用 encodeURIComponent() 单独编码
直接拼接中文、空格、&、=、/ 等字符会导致参数截断或解析错乱。比如 name=张三&李四 会被当成两个参数,id=123/abc 中的 / 可能被误判为路径分隔符。
正确做法是对每个参数值单独调用 encodeURIComponent(),再拼进 URL:
const id = 123;
const name = "张三";
const url = `/detail.html?id=${encodeURIComponent(id)}&name=${encodeURIComponent(name)}`;
注意:encodeURI() 不能替代它——它不编码 &、=、? 等保留字符,拼接时极易破坏 URL 结构。
更安全的写法是用 URLSearchParams:
const params = new URLSearchParams({ id: 123, name: "张三" });
location.href = `/detail.html?${params.toString()}`;
-
URLSearchParams自动处理编码,兼容性好(IE11 需 polyfill) - 重复键(如
?tag=a&tag=b)也能正确解析 - 空值(
?x=&y=1)不会导致split('=')出错
跳转时别用 location.href = url 留脏历史
用 location.href 跳转会新增一条浏览器历史记录,用户点返回可能回到一个带旧参数的中间页(比如搜索页反复显示上一次关键词)。
推荐两种更可控的方式:
- 用
location.replace(url):替换当前历史项,不留下跳转痕迹 - 单页应用中用
history.pushState()+location.assign()组合,适合路由管理
表单提交优先走 ,浏览器自动编码+拼参,最省心且兼容性无死角。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
接收端别手撕 location.search
硬拆 location.search 字符串(比如 split('?')[1].split('&'))在遇到以下情况时容易崩溃:
- 参数含未编码空格(
?q=hello world) - 重复键(
?tag=a&tag=b) - 空值或等号在值里(
?filter=type=&id=456)
统一用 URLSearchParams 解析:
const params = new URLSearchParams(window.location.search);
const id = params.get('id'); // → '123'
const tags = params.getAll('tag'); // → ['a', 'b']
它原生支持多值、空值、自动解码,不用自己 decodeURIComponent()。
超长或敏感数据别塞 URL
URL 长度受浏览器限制(通常 2KB 内较稳妥),且所有参数明文暴露在地址栏、服务端日志、代理缓存中。
这类场景应换方案:
- 传对象、数组、大段文本:用
sessionStorage存后跳转,B 页面读完立刻removeItem() - 跨域页面间:只能用
postMessage(),且必须校验event.origin - 需要服务端参与:改用
提交隐藏字段
特别注意:sessionStorage 在新开标签页、从书签打开、iframe 加载的页面里完全不可见——这不是 bug,是规范行为。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










