JS实现layui table筛选框记忆功能

碰到表中列很多如下表

使用layui table的筛选功能.选完之后呢,关掉浏览器再打开或者换个页面再打开的时候,选择就白选了.这种情况下,客户就要求加个记忆功能.让她下次再打开的时候,还能记忆上次选择的

网上几乎没有这种使用的例子.总之是没有找到相关资料,于是我就把实现的过程记录下来,方便大家用到的时候做个参考.

实现: 记忆的数据可以存到数据库,可以存到本地缓存

本案例放入本地缓存的方式

使用MutationObserver 实现监控点击事件.

由于筛选的跳窗是点开后后加的代码,所以一般的事件onclick是触发不到的.. 就是点击筛选按钮,此时加载跳出框代码, 也就在此是注册onclik 点击事件是不行的. 如果早注册事件,早于页面元素注册,也是抓不到事件滴.页面还没渲染出来,早早的注册了页面里边的点击事件,后来页面渲染出来后,点击是无法响应的,有个先后顺序.

经过控制台点击按钮分析页面代码等等操作

/////筛选框记忆功能
//1页面打开,先读本地缓存
//2读入cols 设置hide true 或者false
//3渲染table
//4加入 筛选框选择框事件获取 并设置本地缓存

<script src="JQuery/jquery-2.2.2.min.js"></script>
<script src="/layui-v2.6.4/layui.js"></script>
<script>
    layui.use(['table','form'], function(){
        var table = layui.table;
        var $ = layui.$;//等同于jquery
        var form = layui.form;
        //选择
        form.on('select(TableName)', function(data){
            $.ajax({
                type: 'get',
                url: '/sss',
                data: {OptionTableID:data.value},
                async:false,
                dataType: 'json',
                success: function (data) {
                    console.log(data);
                    var strHtml = "<option value=''>请选择</option>";
                    for (var i = 0; i < data.length; i++) {
                        strHtml += "<option value='"+data[i].OptionColumnID+"'>"+data[i].ColumnDisplayName+"</option>";
                    }
                    $("#OptionColumnID").html(strHtml);
                    form.render('select');
                },
                error:function(e){
                }
            });
        });
     /*   window.localStorage.setItem('UserName',$("#UserName").val());
        window.localStorage.setItem('Password',$("#Password").val());*/
        /////筛选框记忆功能
        //1页面打开,先读本地缓存
        //2读入cols  设置hide true 或者false
        //3渲染table
        //4加入 筛选框选择框事件获取 并设置本地缓存
        var cols=[[
            {checkbox: true, field:'OptionColumnValueID'},
            {field: "OptionColumnValueID", hide:false, title: "ID", sort: true},
            {field: "ColumnValue", hide:false, title: "字典名称"}   ,
            {title: "操作",  align: "center", fixed: "right", templet: "#barDemo"}
        ]];
        intCols();
       function  intCols()
       {
           for (var i=0;i<cols[0].length;i++)
           {
               if(cols[0][i].field!=undefined)
               {
                   let localfield='test'+cols[0][i].field;
                   let hidevalue =window.localStorage.getItem(localfield);
                   if(hidevalue==='false')
                   {
                       cols[0][i].hide=false;
                   }else if(hidevalue==='true')
                   {
                       cols[0][i].hide=true;
                   }
               }
           }
       }
        //方法级渲染
        table.render({
            elem: '#LAY_table_user'//table元素的ID
            ,id: 'test'//容器的ID
            //,toolbar: "#toolbarTpl"
            ,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
            ,defaultToolbar: ['filter', 'exports', 'print']
            ,url: '/ist'
            ,cols: cols
            /*  ,done: function () {
                  $("[data-field='OptionColumnValueID']").css('display','none');
              }*/
            ,page: true
            ,limits: [10,1000,10000]
            ,limit: 10
            ,where: {
            }
        });
        /////筛选框记忆功能
        //1页面打开,先读本地缓存
        //2读入cols  设置hide true 或者false
        //3渲染table
        //4加入 筛选框选择框事件获取 并设置本地缓存
        // 选择需要观察变动的节点
        const targetNode =document.getElementsByClassName('layui-table-tool');//document.getElementById('some-
        const targetNode1 =document.getElementsByClassName('layui-table-tool-self')[0];//document.getElementById('some-id');
      //  console.log(targetNode);
      //  console.log(targetNode1);
// 观察器的配置(需要观察什么变动)
        const config = { attributes: true, childList: true, subtree: true };
// 当观察到变动时执行的回调函数
        const callback = function(mutationsList, observer) {
            console.log(mutationsList);
          //  console.log(observer);
            // Use traditional 'for loops' for IE 11
            for(let mutation of mutationsList) {
                if (mutation.type === 'childList') {
                   // console.log('A child node has been added or removed');
                }
                else if (mutation.type === 'attributes') {
                    console.log(mutation.target.innerText);
                    //先根据innertext 列名称 对cols 进行field 查询,查到field 可以找到本地缓存的字段,约定,本地缓存的命名规则为表名字母缩写_加field名组成,防止冲突
                    var field="";
                    for (var i=0;i<cols[0].length;i++)
                    {
                        if(cols[0][i].title===mutation.target.innerText)  //标题相同 则取field
                        {
                            field=cols[0][i].field;
                            break;
                        }
                    }
                     if(field!=="")
                     {
                        // 组装缓存key
                         let localkey='test'+field;
                         //判断value值
                        if(mutation.target.classList[2]!=undefined) //说明2: "layui-form-checked"  复选框是已选择的,说明此列是在表中显示的
                        {
                            window.localStorage.setItem(localkey,false);
                        }else  //没被选择,说明此列不在table中显示
                        {
                            window.localStorage.setItem(localkey,true);
                        }
                     }
                }
            }
        };
// 创建一个观察器实例并传入回调函数
           const observer = new MutationObserver(callback);
// 以上述配置开始观察目标节点
           observer.observe(targetNode1, config);
        //监听工具条
        table.on('toolbar()', function(obj){
            var data = obj.data;
            console.log(obj);
        });
        //监听工具条
        table.on('tool(user)', function(obj){
            var data = obj.data;
            console.log(obj);
            if(obj.event === 'del'){
                layer.confirm('确定要删除:'+data.ColumnValue+'么?',
                    {
                        title: '删除',
                        btn: ['确定', '取消']
                    },function(index){
                        autid(data.OptionColumnValueID,table);
                        //obj.del();
                        layer.close(index);
                    });
            }else if(obj.event === 'edit'){
                window.location.href="/xxx/xxxx
            }
            else if(obj.event === 'LAYTABLE_COLS'){
                console.log(123) ;           }
        });
        //监听工具条结束
        //监听排序
        table.on('sort(user)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
            table.reload('test', {//刷新列表
                initSort: obj //记录初始排序,如果不设的话,将无法标记表头的排序状态。 layui 2.1.1 新增参数
                ,where: { //请求参数
                    field: obj.field //排序字段
                    ,order: obj.type //排序方式
                }
            });
        });
        //监听排序结束
        //查询
        $("#chaxun").click(function(){
            table.reload('test', {//刷新列表
                where: {
                    OptionTableID:$('#TableName').val()
                    ,OptionColumnID:$('#xxx').val()
                },page: {
                    curr: 1 //重新从第 1 页开始
                }
            });
        })
        //批量
        $("#allDel").click(function(){
            var checkStatus = table.checkStatus('test')
                ,data = checkStatus.data;
            if (data === undefined || data.length == 0) {
                layer.alert("请勾选要操作的数据!")
            }else{
                var itemids='';
                for(var o in data){
                    itemids +=data[o].xxx+",";
                }
                layer.confirm('确定要删除选中的数据吗?',
                    {
                        title: '删除',
                        btn: ['确定', '取消']
                    },function(index){
                        autid(itemids,table);
                        //obj.del();
                        layer.close(index);
                    });
            }
        });
    });
    function autid(itemids,table){
        var indexload = layer.load(1, {
            shade: [0.3,'#000'],
            success: function(layero, indexload){
                $.ajax({
                    url: '/xxx',
                    type:'POST',
                    dataType: 'json',
                    data: {
                        itemIds:itemids
                    },
                    success: function (ret) {
                        console.log(ret)
                        if(ret.res=="ok"){
                            layer.alert('操作成功!', function(index){
                                layer.close(index);
                                layer.close(indexload);
                                table.reload('test', {
                                    where: {
                                    }
                                });
                            });
                        }else{
                            layer.close(indexload);
                        }
                    }
                });
            }
        });
    }
</script>

到此这篇关于实现layui table筛选框记忆功能的文章就介绍到这了,更多相关layui table筛选框内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • layui table 复选框跳页后再回来保持原来选中的状态示例

    layui table默认跳页后不存在源页面选中的状态.如果要实现记录源页面的选中状态,需要定义一个全局变量来记录数据选中状态. 1.修改table.js ;layui.define(["laytpl", "laypage", "layer", "form"], function (e) { "use strict"; var t = layui.$, i = layui.laytpl, a = layui

  • layui table表格数据的新增,修改,删除,查询,双击获取行数据方式

    layui table利用参数新增,修改,删除,查询,双击数据行获取本行数据等.模块化使用layui table表格,通过二次封装实现语法上的解耦使用layui table,使用参数就可以以及外部的方法调用即可实现对layui table表格的操作,通过封装,把更多自主权交给页面自定义,layui:v:2.3.0.感谢layui的作者贤心. 演示效果如下: 以上json显示不完整是录屏的原因,请见谅! var Table = function(ops){ this.dataList = [];

  • JS实现layui table筛选框记忆功能

    碰到表中列很多如下表 使用layui table的筛选功能.选完之后呢,关掉浏览器再打开或者换个页面再打开的时候,选择就白选了.这种情况下,客户就要求加个记忆功能.让她下次再打开的时候,还能记忆上次选择的 网上几乎没有这种使用的例子.总之是没有找到相关资料,于是我就把实现的过程记录下来,方便大家用到的时候做个参考. 实现: 记忆的数据可以存到数据库,可以存到本地缓存 本案例放入本地缓存的方式 使用MutationObserver 实现监控点击事件. 由于筛选的跳窗是点开后后加的代码,所以一般的事

  • 使用原生js编写一个简单的框选功能方法

    今天我们来聊一下怎么使用原生javascript编写一个简单的框选功能. 需求描述 鼠标左键按下不放,移动鼠标出现矩形选框: 鼠标左键松开,根据上边出现的矩形选框统计选框范围内的DOM元素: 嗯...上边的功能描述看着是挺简单的,但实现起来也还是会有些地方需要斟酌思考的.比如,如果我们的框选范围不是document.body,而是某一个div里边进行框选呢?而现实开发过程中,我们会遇上的应该就是第二种情况. 点击查看完整的源码 怎么实现 二话不说,咱们动手写代码吧!因为更好的兼容性,这里就避免了

  • 基于layui的table插件进行复选框联动功能的实现方法

    实际项目功能: 给员工账号进行分配权限(增加权限,修改权限) 实现思路: 用表格展示权限列表–>勾选分配该账号的权限–>调用接口 出现的问题: 因为某些权限之间是有关联的,比如: " 查看材料 " 和 " 修改材料 " ,这两个权限是有联系的,当你勾选 " 修改材料 " 权限的时候,那么, " 查看材料 " 权限也要勾选上,当你取消勾选 " 查看材料 "权限的时候," 修改材料 &qu

  • JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题

    正文 前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案  JS组件系列--Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bootstrapTable的冻结列效果,并且可以兼容ie浏览器.这一年的时间,不断有园友以及群里面的朋友问过我关于固定高度之后,冻结列页面效果不能对齐的问题,奈何博主太忙,一直没有抽空将这个问题优化.最近项目里面也不断有人提过这个bug,这下子不能再推了,必须要直面"惨淡的bug",于

  • Bootstrap Table 搜索框和查询功能

    1..知识点bootstrapTable 刷新和查询配置 2.提升js代码性能 1.减少全局变量声明 2.缓存dom节点查找结果 3.局部变量缓存全局变量 /** * @param col bootstrapTable列表生成配置对象 */ var searchValue ={};//查询匹配对象 var $button = $('<div class="columns pull-right search-button"><button class="btn

  • layui table复选框禁止某几条勾选的实例

    Layui table复选框禁止勾选 var list = [0,1,3];//获得禁用的tr的行index //遍历设置复选框禁用 for(var i=0;i<list.length;i++){ $(".layui-table tr[data-index="+list[i]+"] input[type='checkbox']").prop('disabled',true); $(".layui-table tr[data-index="+

  • 使用JS location实现搜索框历史记录功能

    首先,来看下效果图(样式什么的就不必吐槽了哈) html代码 <form id="hisform"> <div id="searchbox"> <input id="inpt" type="text" autocomplete="off" /> <input id="btn" type="button" value="

  • JS实现table表格数据排序功能(可支持动态数据+分页效果)

    asp.net会经常遇到分页的效果,尤其是希望实现静态的html分页排序(html分页相信大家都已经有自己的解决方案.在这里就不多说).我写了一个简单的Demo排序. 数据就是字母和数字两组.(汉字需要找到asc码) 原理就是利用数组自带的sort排序,进行表格重组.已在.net mvc 中测试过.支持分页.(申明一点.只对当前页面数据排序 无刷新,对所有页面排序的话,肯定需要刷新.这点我还在解决中.)希望有新想法的高手们,给下指点. 下面把html的代码贴出来: <!DOCTYPE HTML

  • JS实现CheckBox复选框全选全不选功能

    CheckBox控件就是我们一般所说的复选框,通常用于某选项的打开或关闭.大多数应用程序的"设置"对话框内均有此控件.我们看到的可以打勾的就是CheckBox. 该控件表明一个特定的状态(即选项)是选定 (on,值为1) 还是清除 (off,值为0).在应用程序中使用该控件为用户提供"True/False"或"yes/no"的选择.因为 CheckBox 彼此独立工作,所以用户可以同时选择任意多个 CheckBox,进行选项组合. CheckBo

随机推荐