必须在form.on('submit')回调首行加return false或event.preventDefault()阻止原生提交,再通过axios发请求,成功后用location.assign配合URLSearchParams安全跳转并传参,目标页用URLSearchParams.get()读取。
submit 事件里用 location.href 跳转会丢失参数
直接在 form.on('submit') 回调里写 location.href = '/next?uid=123' 看似可行,但实际常导致跳转失败或参数不生效——因为 layui 默认会触发表单原生提交(即使你 return false),而原生 submit 会刷新页面,覆盖你的 js 跳转逻辑。
根本原因是:Layui 的 form.on('submit') 监听器默认不阻止表单默认行为,除非你显式 return false 或调用 event.preventDefault()。
- 必须在回调第一行加
return false或event.preventDefault() - 跳转前确保接口返回成功(比如
res.code === 0),别在请求发出去之前就跳 - 传参建议用 URLSearchParams 构造查询字符串,避免手动拼接出错(如中文、特殊字符)
用 axios + location.assign 安全跳转并带参
推荐用异步请求代替表单默认提交。先拦截 submit,发请求,成功后再跳转,可控性强、参数可靠。
示例代码片段:
form.on('submit(formDemo)', function(data){
axios.post('/api/login', data.field)
.then(function(res) {
if(res.data.code === 0) {
const params = new URLSearchParams({uid: res.data.data.uid, token: res.data.data.token});
location.assign(`/dashboard?${params}`);
} else {
layer.msg(res.data.msg || '提交失败');
}
})
.catch(function(){
layer.msg('网络错误');
});
return false; // 阻止原生提交
});
-
location.assign()比location.href =更明确表示“导航”,且不会被某些浏览器缓存策略干扰 - 不用
window.open()或location.replace():前者开新页,后者无法后退 - 如果后端返回的是完整跳转 URL(如
{redirect: "/home?x=1"}),可直接location.assign(res.data.redirect)
跳转后在目标页用 URLSearchParams 读参
别再用正则或 split 解析 query string——容易漏掉编码、多值、空值等边界情况。
在目标页面(如 dashboard.html)中这样取参:
const urlParams = new URLSearchParams(window.location.search);
const uid = urlParams.get('uid'); // 自动解码
const token = urlParams.get('token');
-
URLSearchParams.get()返回 null 而不是 undefined,适合做条件判断 - 若参数可能重复(如
?tag=a&tag=b),用urlParams.getAll('tag') - Layui 本身不提供 URL 解析工具,必须手写或依赖原生 API
注意 iframe 场景下 location 失效
如果表单所在页面是嵌在 <iframe></iframe> 里的,直接 location.assign() 只会在 iframe 内跳转,而不是整个父页面。
- 需要跳父页时,改用
parent.location.assign(...) - 但需确保父子页同源,否则会触发跨域限制,报错
Blocked a frame with origin ... from accessing a cross-origin frame - 若跨域,只能让后端返回跳转地址,前端用
window.open(url, '_top')强制在顶层打开(体验略差)
参数编码、跳转时机、上下文环境——这三个点漏掉任何一个,都会让“跳转传参”变成玄学问题。











