layer.js iframe弹窗传值与layui表格渲染实战
本文深入解析layer.js在iframe弹窗中通过success回调传值时遇到的DOM获取难题,指出上下文差异导致的选取失败原因,并提供正确的jQuery操作示例。同时结合layui框架,展示如何规范转换表格渲染数据格式,并实现弹窗内表格的选中交互功能,为前端开发提供实用参考。
layer.js使用心得-向弹出框传值
问题背景
为了实现弹出对话框加载独立页面的功能,项目最终选用了layer.js组件。
利用layer.js组件弹出一个新的iframe窗口(此处假设其name为LayerFrame,便于后续描述),核心需求是从父页面或主窗口向该iframe内部传入参数。
需要注意的是,'#sayHello'这一触发元素位于主窗口的HomeFrame(HomeFrame是主窗口内的一个子iframe)中。
具体实现代码如下:
$('#sayHello').click(function () {
top.layer.open({
id: "layer_say_hello",
type: 2,
title: '打招呼',
shadeClose: true,
shade: 0.8,
area: ['500px', '400px'],
content: '/Findfriend/Part_SayHello', //iframe的url
success: function (layero, index) {
//传入参数,并赋值给iframe的元素
}
});
})问题描述
在layer.open的success回调函数中,尝试使用jQuery选取弹出iframe内部的元素时,发现无法成功获取。
问题分析
经过反复调试与排查,最终定位到问题根源。关键在于理解回调函数的执行上下文。
根本原因在于:
success回调函数的执行上下文并非主窗口的上下文,而是HomeFrame的上下文。因此,在success回调中可以直接访问并找到HomeFrame中的DOM元素。
若要操作LayerFrame内部的元素,必须先获取LayerFrame对应的DOM对象,进而访问其document对象,最后才能基于该document去查找LayerFrame内的具体元素。
修正后的正确代码如下:
$('#sayHello').click(function () {
top.layer.open({
id: "layer_say_hello",
type: 2,
title: '打招呼',
shadeClose: true,
shade: 0.8,
area: ['500px', '400px'],
content: '/Findfriend/Part_SayHello', //iframe的url
success: function (layero, index) {
var her_uli_id = $("#headico").attr("data-uli-id"); //headico 是 HomeFrame的元素
var her_nickname = $("#nickname").text(); //nickname 是 HomeFrame的元素
// layero.find("iframe") 找到iframe的jquery对象
// layero.find("iframe")[0] 将jqeruy对象转化为Dom对象
// contentWindow 获取当前 iframe 的 内容 window对象(Dom对象)
//.send-hello 是 LayerFrame 的元素
var jquerySendHelloButton = $(".send-hello", layero.find("iframe")[0].contentWindow.document);
jquerySendHelloButton.attr("data-her-uli-id", her_uli_id);
jquerySendHelloButton.attr("data-her-nick-name", her_nickname);
}
});
})layui传值的一些经验,也没怎么整理:表格渲染数据,弹出框
1.layui向表格渲染数据的格式转换
buffer.append("{\"code\":0,\"msg\":\"\",\"count\":" + countTotal + ",\"data\":[" + buffer2 + "]}");
StringBuffer buffer = new StringBuffer();
StringBuffer buffer2 = new StringBuffer();
try {
if (takenumberlist.size() != 0 && takenumberlist != null) {
buffer2 = JsonUtils.listTojson(buffer2, takenumberlist);
}
buffer.append("{\"code\":0,\"msg\":\"\",\"count\":" + countTotal + ",\"data\":[" + buffer2 + "]}");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
model.addAttribute("buffer", buffer.toString());
System.out.println("layui传值执行成功!");
return buffer.toString();后端需要引入并使用一个工具类JsonUtils.java来处理数据序列化。
前端界面接收部分代码如下:<table class="layui-hide" id="demo" lay-filter="test">
前端JS配置如下:
table.render({
elem: '#demo'
,width : 430
,height: 535
,url: "http://localhost:8080/hospital/takenumber.do?ks_code=${dept_code}" //数据接口
,page: true //开启分页
,autoSort: true//自动排序
, initSort: {field:'id', type:'asc'}
/* ,totalRow: true *///开启合计行
,cols: [[ //表头
{type: 'checkbox', fixed: 'left'}
,{field: 'id', title: '编号', width:80, sort: true, totalRow: true}
,{field: 'person_name', title: '姓名', width:85}
,{field: 'queue_code', title: '取号号码', width: 115, sort: true, totalRow: true}
,{field: 'specify_doctor_code', title: '医生工号', width: 96, sort: true, totalRow: true}
/* ,{field: 'doctor_name', title: '医生', width:80, sort: true} */
/* ,{fixed: 'right', width: 165, align:'center', toolbar: '#barDemo'} */
]]
});2. layui弹出框,并且在表格里选中
弹出框的HTML结构定义如下:
<script type="text/html" id="move-dialog">
<form class="layui-form" action="" lay-filter="move-form">
<div class="layui-form-item">
<label class="layui-form-label" style="width:110px;text-align:center">姓名</label>
<div class="layui-input-block">
<input type="hidden" name="id" required lay-verify="required" placeholder="姓名" class="layui-hidden" disabled>
<input type="text" name="person_name" lay-verify="" placeholder="姓名" class="layui-input" disabled>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:110px;text-align:center">取号号码</label>
<div class="layui-input-block">
<input type="text" name="queue_code" lay-verify="" placeholder="取号号码" class="layui-input" disabled>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:110px;text-align:center">当前排序号</label>
<div class="layui-input-block">
<input type="number" name="order_by_num" lay-verify="move" placeholder="排序号" class="layui-number" >
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="but-move-submit">保存</button>
<!-- <button type="reset" class="layui-btn layui-btn-primary">重置</button> -->
</div>
</div>
</form>
</script>触发弹出框的逻辑代码如下:
$("#but-appoint").click(function(){
var array = table.checkStatus('demo').data;
if(array.length==0){
layer.msg('请选择要操作的记录');
}else if(array.length != 1){
layer.msg('每次只能选择一行');
}else{
console.log(array);
layer.open({//定义一个对话框
type : 1,
title : '医生指定',
content : $("#appoint-dialog").html(),//加载表格元素给content
area : ['600px','450px']
})
form.val('appoint-form',{//填充表单
"id" : array[0].id,
"person_name" : array[0].person_name,
"queue_code" : array[0].queue_code,
"doctor_name01" : array[0].doctor_name,
"specify_doctor_code" : array[0].specify_doctor_code
})
form.on('submit(but-appoint-submit)',function(data){//提交表单到后台
console.log(data.field.id);
console.log(data.field.doctor_name);
console.log(data.field.doctor_code);
console.log(data.field.specify_doctor_code);
$.post('http://localhost:8080/hospital/appoint.do',data.field,function(flag){
if(flag){
layer.msg('操作成功',{icon: 6});
console.log(data.field.doctor_code);
layer.closeAll();//关闭弹出框
table.reload('demo',{});//重新加载
}else{
layer.msg('操作失败',{icon: 5});
}
})
return false;
})
}
})以上为个人经验总结,希望能给大家一个参考,也希望大家多多支持本站。
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
JS使用constructor判断数据类型可靠吗
2026-11-05 13:49:41
