layui 弹出层中显示table 表格

本文介绍如何使用LayUI框架实现一个包含产品查询和展示功能的实时弹窗。通过HTML、JavaScript和Vue.js的结合,展示了如何响应式地创建弹窗界面,动态加载表格数据,并实现分页、排序等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

html:

点击按钮显示弹窗:

<script type="text/html" id="openProductCount">
	<a href="javascript:;" class="layui-table-link" style="display: inline-block; width: 100%;" onclick="openProductCount('{{d.companyId}}')">{{d.openProductCount}}</a>
</script>

 

弹窗模板:

<div id="openProductBox" style="display: none; padding: 10px;">
	<div style="margin-bottom: 10px;">
		<span>产品名称:</span>
		<div class="layui-inline">
		    <input type="text" autocomplete="off" placeholder="产品名称" class="layui-input" style="height:32px;" v-model="open.productName"
						 @keyup.enter="openQuery">
		</div>
		<button class="layui-btn layui-btn-sm" @click="openQuery"><i class="layui-icon layui-icon-search"></i>&nbsp;查询</a>
	</div>
	<table id="openProductTable" lay-filter="openProductTable"></table>
</div>

js:

var table2;

function openProductCount(companyId) {
	fkCompanyId = companyId;
	layui.use(['table', 'form'], function() {
		table2 = layui.table;
		var form = layui.form;
		layer.open({
			type: 1,
			title: '开通产品数量',
			area: ['700px', '600px'], //宽高
			content: $('#openProductBox'),
			end: function() {
				vm.query.productName = '';
			},
			success: function() {
				table2.render({
					elem: '#openProductTable',
					id: 'openProductTable',
					height: 480,
					method: 'get', //接口http请求类型,默认:get
					url: baseURL + 'unCompanyAccountInfo/queryCompanyProductMergerList', //?page=1&limit=10(该参数可通过 request 自定义)
					where: {
						fkCompanyId: companyId,
					}, //接口的其它参数
					request: {
						pageName: 'page', //页码的参数名称,默认:page
						limitName: 'rows', //每页数据量的参数名,默认:limit
					},
					response: {
						statusName: 'code', //规定数据状态的字段名称,默认:code
						statusCode: 200, //规定成功的状态码,默认:0
						msgName: 'msg', //规定状态信息的字段名称,默认:msg
						countName: 'count', //规定数据总数的字段名称,默认:count
						dataName: 'resultList', //规定数据列表的字段名称,默认:data
					},
					page: true, //是否分页
					limit: 10, //每页显示的条数
					limits: [10, 20, 30], //每页条数的选择项,默认:[10,20,30,40,50,60,70,80,90]。
					cols: [
						[{
							field: 'productName', //字段名
							title: '产品名称', //标题
							//width: 200,
							sort: true //是否允许排序 默认:false
							//fixed: 'left' //固定列
						}, {
							field: 'totalNumber', //字段名
							title: '总次数', //标题
							width: 100,
							sort: true //是否允许排序 默认:false
							//fixed: 'left' //固定列
						}, {
							field: 'lastNumber', //字段名
							title: '剩余次数', //标题
							width: 100,
							templet: '#lastNumber',
							sort: true //是否允许排序 默认:false
							//fixed: 'left' //固定列
						}, {
							field: 'channelName', //字段名
							title: '当前渠道', //标题
							width: 165,
							sort: true //是否允许排序 默认:false
							//fixed: 'left' //固定列
						}, {
							field: 'fkCompanyId', //字段名
							title: '状态', //标题
							width: 100,
							templet: function(d) {
								if (d.fkCompanyId == null) {
									return '<span class="layui-badge" style="cursor: pointer;" onclick="activeState(\'' + d.productId +
										'\')">未激活</span>'
								} else {
									return '<span class="layui-badge layui-bg-green" style="cursor: pointer;">已激活</span>'
								}
							},
							sort: true //是否允许排序 默认:false
							//fixed: 'left' //固定列
						}]
					]
				});
			}
		});
	});
}

 

<think>我们在使用Layui弹出时,经常需要重置表单状态,特别是复选框。根据用户需求,每次打开弹出时,需要重置复选框的选中状态。我们可以通过以下步骤实现: 1. 在弹出页面(子)中,编写一个重置复选框的函数。 2. 在父打开弹出时,可以传递重置函数给子,或者在子加载完成后自动重置。 3. 利用Layui的form模块重新渲染复选框。 具体实现如下: ### 方法1:在弹出页面加载时重置 在弹出页面(即子)中,我们可以利用Layui的`form`模块来重置复选框。在子页面的JavaScript中,可以在页面加载完成后立即执行重置操作。 假设子页面(/selectProduct)中的复选框结构如下: ```html <form class="layui-form"> <div class="layui-form-item"> <input type="checkbox" name="hobby" value="1" title="阅读"> <input type="checkbox" name="hobby" value="2" title="写作" checked> <input type="checkbox" name="hobby" value="3" title="运动"> </div> </form> ``` 在子页面的JavaScript中: ```javascript layui.use(['form'], function(){ var form = layui.form; // 重置所有复选框为未选中状态 $('input[type="checkbox"]').each(function(){ $(this).removeAttr('checked'); }); // 重新渲染复选框 form.render('checkbox'); }); ``` ### 方法2:父在打开弹出时传递重置指令 如果希望由父控制子的重置,可以在打开弹出时传递一个参数,告诉子需要重置。在子中监听父传递的参数。 父打开弹出时传递参数: ```javascript layer.open({ title: '选择产品', type: 2, area: ['70%', '60%'], content: '/selectProduct?reset=true', // 传递reset参数 // 其他参数... }); ``` 在子页面中,解析URL参数,如果存在reset参数且为true,则执行重置: ```javascript layui.use(['form', 'jquery'], function(){ var form = layui.form, $ = layui.jquery; // 获取URL参数 function getQueryParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } if (getQueryParam('reset') === 'true') { // 重置复选框 $('input[type="checkbox"]').each(function(){ $(this).removeAttr('checked'); }); form.render('checkbox'); } }); ``` ### 方法3:通过弹出的回调函数重置(推荐) 另一种更直接的方式是在父打开弹出后,通过操作子的DOM来重置。这需要利用`layer.open`的`success`回调函数,在弹出加载完成后执行重置操作。 父代码: ```javascript layer.open({ title: '选择产品', type: 2, content: '/selectProduct', area: ['70%', '60%'], success: function(layero, index){ // 获取子的body var body = layer.getChildFrame('body', index); // 在子中重置复选框 body.find('input[type="checkbox"]').each(function(){ $(this).removeAttr('checked'); }); // 重新渲染复选框,需要用到子的form var childForm = body.find('.layui-form'); if (childForm.length > 0) { layui.form.render('checkbox', childForm.selector); // 注意:这里需要指定渲染的表单容器 } } }); ``` 注意:由于Layui的form模块需要知道渲染的范围,所以我们在重新渲染复选框时需要指定表单的容器。但是,这种方式需要确保子Layui form已经初始化,并且父能够访问到子的DOM。由于跨iframe的操作,可能受到同源策略的影响,如果子与父同源则没有问题。 ### 方法4:使用子暴露的全局函数 在子中定义一个全局函数供父调用,例如: 子页面: ```javascript function resetCheckboxes() { $('input[type="checkbox"]').each(function(){ $(this).removeAttr('checked'); }); layui.form.render('checkbox'); } ``` 父在打开弹出后,可以通过`success`回调来调用子的全局函数: ```javascript layer.open({ // ...其他参数 success: function(layero, index){ var childWindow = layer.getChildFrame(window, index); childWindow.resetCheckboxes(); } }); ``` ### 总结 以上提供了多种方法来实现每次打开弹出时重置复选框的选中状态。根据实际项目结构和需求选择合适的方法。其中,方法3和方法4需要确保父能够访问到子的DOM或全局函数,适用于同源页面。方法1和方法2则更依赖于子自身的逻辑。 §§相关问题§§ 1. Layui中如何动态重置表单的其他元素(如单选、下拉框)? 2. Layui弹出如何实现数据回填? 3. 在Layui中,如何避免弹出多次打开导致的事件重复绑定? 4. Layui的复选框有哪些常用事件?如何监听复选框的选中状态变化?</think>### Layui 弹出每次打开时重置复选框选中状态的实现方法 在 Layui 弹出中重置复选框状态,可通过以下步骤实现: #### 核心方案 1. **在弹出打开时执行重置** ```javascript layer.open({ title: '选择产品', type: 2, content: '/selectProduct', success: function(layero, index) { // 获取子DOM const childBody = layer.getChildFrame('body', index); // 重置所有复选框 childBody.find('input[type="checkbox"]').prop('checked', false); // 重新渲染表单 layui.form.render('checkbox'); } }); ``` 2. **子独立重置方案(推荐)** 在弹出页面添加初始化函数: ```javascript // 子页面中 function resetCheckboxes() { $('input[type="checkbox"]').each(function() { $(this).prop('checked', false); }); layui.form.render('checkbox'); // 关键:重新渲染 } // 页面加载时自动执行 $(function() { resetCheckboxes(); }); ``` #### 完整实现示例 ```html <!-- 父页面 --> <script> layui.use(['layer', 'form'], function(){ const layer = layui.layer; const form = layui.form; // 打开弹出按钮事件 $('#openLayer').click(function(){ layer.open({ title: '选择产品', type: 2, area: ['800px', '500px'], content: 'select.html', success: function(layero, index){ // 重置子复选框(方法1) const iframeWin = window[layero.find('iframe')[0]['name']]; iframeWin.resetCheckboxes && iframeWin.resetCheckboxes(); } }); }); }); </script> <!-- 子页面 (select.html) --> <div class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">选项</label> <div class="layui-input-block"> <input type="checkbox" name="option" title="选项1"> <input type="checkbox" name="option" title="选项2"> <input type="checkbox" name="option" title="选项3"> </div> </div> </div> <script> // 子重置函数 function resetCheckboxes() { $('input[type="checkbox"]').each(function() { $(this).prop('checked', false); }); layui.form.render('checkbox'); // 必须重新渲染 } // 页面加载时重置 layui.use('form', function(){ resetCheckboxes(); }); </script> ``` #### 关键点说明 1. **跨iframe操作**:使用`layer.getChildFrame()`获取子DOM 2. **状态重置**:`prop('checked', false)`直接修改复选框状态 3. **重新渲染**:`layui.form.render('checkbox')`更新UI显示 4. **多页签处理**:结合`table.setLayuiPageCheckedIds()`处理表格复选框[^2] #### 常见问题解决 - **动态内容加载**:对于异步加载的复选框,在数据加载完成后调用`resetCheckboxes()` - **表格复选框**:使用`table.initPageCheckedIds('tableId', '')`清空选中[^2] - **事件冲突**:避免使用`shadeClose:true`时误触发重置,可改用`end`回调
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值