layer.open 的 content 参数只接受字符串,JSON 需通过 data 配置项(type: 2)或 success 回调 + dataset(type: 1)传递;跨域或大数据量时需改用 sessionStorage 或服务端透传。
layer.open 的 content 参数不支持直接传 JSON 对象
很多人试图这样写:content: {title: 'xxx', data: {id: 123}},结果子页面收不到——因为 content 只接受字符串(html 片段、url 或 dom 节点),不是数据容器。json 必须转成可携带的形式。
推荐做法:用 layer.open 的 data 配置项传参
Layui 2.8+ 原生支持 data 参数(低版本需手动升级或改用其他方式)。它会自动把对象序列化为 URL 查询参数,并注入 iframe 的 src 中(仅对 type: 2 有效):
layer.open({
type: 2,
content: '/page/detail.html',
data: {id: 123, status: 'draft'},
area: ['600px', '400px']
});
子页面中用以下方式取值:
-
new URL(window.location).searchParams.get('id')(推荐,兼容性好) - 或解析
window.location.search手动提取(适合老浏览器)
注意:data 只对 type: 2(iframe 层)生效;type: 1(内嵌 HTML)不走 URL,得换方法。
type: 1 弹层传 JSON:用 success 回调 + DOM dataset 或全局变量
当内容是内联 HTML(type: 1)时,无法靠 URL 传参,必须在弹出后往子内容里“塞”数据:
- 用
success回调拿到弹层 DOM,再通过dataset挂载:success: function(layero){ layero.find('.my-content').attr('data-json', JSON.stringify({id: 123})) } - 子页面 JS 直接读:
JSON.parse(document.querySelector('.my-content').dataset.json) - 不推荐全局变量(如
window.layerData),易冲突且难维护
关键点:确保子内容已渲染完成再读取,避免 DOM 未就绪导致 null 报错。
容易被忽略的坑:中文/特殊字符没编码、子页面跨域、JSON 太大
data 参数底层拼的是 URL 查询串,所以:
- 中文或符号必须由 Layui 自动 encode(它内部做了),但自己拼 URL 时务必用
encodeURIComponent() - 如果子页面是不同域名(跨域 iframe),
window.location.search可读,但 DOM 操作、postMessage等受限,此时只能靠服务端透传或改用type: 1+ 同源内容 - URL 长度有限(通常 ≤2048 字符),别传大 JSON;超限时建议改用 sessionStorage 先存,再在子页面读取
最稳的组合是:type: 2 + data + 子页面用 URLSearchParams 解析——只要不跨域、数据不大,基本零踩坑。










