最稳路径是父页在layer.open的success回调中将接收函数挂到window全局,子页确认parent.receivedata存在后调用传对象;需加类型校验、大小写敏感、先调用再关闭弹窗,禁用getchildframe读局部变量。

在Layui iframe弹窗中,子页面需将包含嵌套数组、布尔值、null等完整结构的JavaScript对象安全传回父页面,不能依赖URL拼接或localStorage模拟,必须绕过执行时机错位与作用域隔离问题。
父页面提前挂载接收函数(必须在success回调内)
第一步:调用layer.open时,在success回调里把接收函数挂到window上,确保子页能通过parent访问到——【不写在layui.use内部或$(document).ready里,否则子页访问parent.receiveData会报undefined】。
第二步:函数体要加类型校验,避免子页误传字符串或null导致父页崩溃:window.receiveData = function(data) { if (!data || typeof data !== 'object') return; console.log('收到复杂对象:', data); };
第三步:函数名必须全小写且与子页调用时完全一致,大小写敏感,比如子页写parent.receiveData,父页就不能定义成ReceiveData。
子页面确认函数存在后传对象并关闭
方法一:轮询检测(最稳)
在子页DOM加载完成后,用setTimeout循环检查parent.receiveData是否为function,最多试500ms,避免因父页JS加载慢导致调用失败。
方法二:直接判断后执行(适合简单场景)if (typeof parent.receiveData === 'function') { parent.receiveData({ id: 123, name: '张三', tags: ['a', 'b'], active: true, meta: null }); } 这一步操作起来很简单,直接把对象传进去就行。
调用完立刻关弹窗:var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); 注意顺序:必须先调用receiveData再close,否则父页回调执行时DOM可能已销毁,报Cannot read property 'xxx' of null。
为什么不能用layer.getChildFrame读子页变量
layer.getChildFrame返回的是子页document对象,不是JS执行环境。你在子页里写的var formData = { ... };是局部变量,根本不在DOM树上,父页用iframe.find(...)或contentWindow都拿不到——这跟jQuery选中一个input然后.val()是两回事,一个是操作DOM,一个是读JS内存。
跨域时这条路彻底走不通,浏览器会直接拦截并报错Blocked a frame with origin ... from accessing a cross-origin frame,此时必须换postMessage,但本方案默认同源。











