layui单元格编辑下拉框-控制表格滚动条显示隐藏

都24年还在用layui,太难搞了,最近需要在表格内编辑,以及使用下拉框编辑,有很多博主都已经有编写好的了,但都有个问题就是滚动条会消失,本篇主要记录解决这个问题

(思路就是监听下拉框的聚焦和失焦来控制样式显示)
问题是因为加了以下样式导致的,不加的话下拉框又会被隐藏

.layui-table-body,
.layui-table-box,
.layui-table-view,
.layui-table-cell {
    overflow: visible;
}

 主要是.layui-table-body这个样式,$(".layui-table-body")打印查找一下这个样式,发现有好几个,找到主体表格的那个,我的是'div.layui-table-body.layui-table-main',其实都行

接下来就是监听聚焦失焦了,因为下拉框都是在table里面用templet渲染的,在外面是监听不到的,要在表格done方法里执行监听,
dom操作太耗性能了,尽量减少触发操作

let $temp=null;//缓存整个表格.layui-table-body元素对象
var focusChageState=false;//聚焦失焦状态,避免同状态时再触发

var tableIns = table.render({
			elem: '#test'
			...
			, cols: [[
            //templet 提供了三种使用方式,我这里用了第一种,
            //后端是php直接模板传值,不用再jq遍历回显,需要的可以看其它博主的
			, { field: 'valShop', ..., templet:"#selectTpl"}
			]]
			, done: function (res, curr, count) {
				
                //缓存整个表格.layui-table-body元素对象
				$temp=$('div.layui-table-body.layui-table-main')
				// $temp=$('.layui-table-body')
                //监听聚焦失焦
				$(document).ready(function() {
                    //下拉框开启了模糊搜索,layui把会渲染出input框,
                    //在外层元素上加个id或类名.selectBox 好定位,避免其它input被监听
					$('.selectBox .layui-input').on('focus', function() {
						debounce(true) //聚焦触发
					}).on('blur', function() {
						debounce(false) //失焦触发
					}); 
				}); 

			}
		});

var timeout =null;//定时器
//防抖触发,避免有时失焦太快会选中无效,
//避免连续触发,避免同时打开多个下拉框连续触发
function debounce(type){
	clearTimeout (timeout)//简单的防抖,不知道为什么网上copy的防抖不生效
	timeout = setTimeout(() => {  
		focusChage(type)
    }, 200);
}

//滚动条显示和隐藏
function focusChage(type){
	console.log('执行了');
	if(type != focusChageState){//同状态时不触发,有时选中会触发两次失焦,
                                //同时打开多个下拉框时会多次触发聚焦,因为防抖掉了失焦事件
		if(type){               
			onsole.log('聚焦!');
			focusChageState=true;//记录聚焦状态
			$temp.css('overflow', 'visible');
		}else{
			console.log('失焦!');
			focusChageState=false;//纪录失焦状态
			$temp.css('overflow', '');
		}
	}
			
}

到这里就已经可以用了,就是还有问题没解决,打开下拉框不勾选,又编辑其它单元格输入框,下拉框不会关闭,暂时不管了

这里贴个 templet:"#selectTpl"下拉框部分,因为是php模板传值,参考就行了,其它的就还得是遍历回显,可以看其他参考的博主,

如果是在表格done方法里遍历回显,设置下拉框value值后还是不回显时,最后加上form.render();//刷新一下表单

//templet 提供了三种使用方式,这里用id模板绑定
<script type="text/html" id="selectTpl">
 <div class="layui-form-item selectBox" style="text-align: left;">
  <select .... data-select="{{d.id}}" lay-search>
		<option value=""></option>
		{volist name=":vae_get_config('shop_novel')" id="v"}
          <option value="{$key}" {{ d.valShop== '{$key}' ? 'selected' : '' }}>{$v}</option>
		{/volist}
   </select>
 </div>
</script>
//{{d.id}},{{d.valShop}},是layui 使用templet可以把整行数据{{d}}传过来,方便大家使用自己的数据
//把id存起来方便选中时使用form.on获取,var selectId = data.elem.getAttribute('data-select');

参考链接:https://zhuanlan.zhihu.com/p/709438254

                  https://blog.csdn.net/qq_51110402

可以通过在表格中的单元格内添加下拉框来实现该功能,具体步骤如下: 1. 在表格中指定单元格内添加一个 `div` 元素,该元素用于容纳下拉框。 ```html <table class="layui-table"> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>性别</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>18</td> <td> <div class="dropdown"> <select> <option value="男">男</option> <option value="女">女</option> </select> </div> </td> </tr> <!-- 其他行省略 --> </tbody> </table> ``` 2. 使用 `layui.form.render()` 方法对表单进行渲染,以便 `select` 元素能够正确显示。 ```html <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/layui/2.5.6/layui.min.js"></script> <script> layui.use(['form'], function () { var form = layui.form; form.render(); }); </script> ``` 3. 使用 jQuery 监听单元格的点击事件,并在点击事件中显示隐藏下拉框。 ```html <script> $(function () { $('.dropdown').click(function (event) { event.stopPropagation(); // 防止单击事件冒泡到表格行 $('.dropdown').not(this).removeClass('open'); $(this).toggleClass('open'); }); $('html').click(function () { $('.dropdown').removeClass('open'); }); }); </script> ``` 4. 样式表中添加下拉框的样式。 ```html <style> .dropdown { position: relative; display: inline-block; } .dropdown select { width: 100%; padding: 6px 12px; border: 1px solid #d2d6de; border-radius: 2px; background-color: #fff; background-image: none; -webkit-appearance: none; -moz-appearance: none; appearance: none; cursor: pointer; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; } .dropdown.open select { z-index: 2; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值