layui表格 监听鼠标右键的心得

之前看过一篇文章 ,在这里 我把他贴出来
原文链接:https://blog.youkuaiyun.com/DengZY926/article/details/82011955

layui.use(['table', 'layer'], function () {
      var table = layui.table,
      layer = layui.layer;
      table.render({
           elem: '#filing_info_table',
           height: 'full-65',
           page: true, //开启分页
           cols: [cols],
           data: data,
           done: function (res, curr, count) {
           var data = res.data;
           $('.layui-table-body tr').each(function (e) {
                 //表单鼠标右键操作
                 $(this).mousedown(function (e) {
                 var index = $(this).attr('data-index');  //获取该表格行的数据
                 if (e.which == 3) {    //判断时鼠标右键按下
                        $("#menu").show();        //显示鼠标右键菜单列表
                        var x = e.originalEvent.x + 'px';  //获取鼠标位置x坐标
                        var y = e.originalEvent.y + 'px';  //获取鼠标位置y坐标
                        $("#menu").css({
                              top: y,    //定位右键菜单的位置
                              left: x
                         });
                         trdata = data[index];    //将该行的数据存放到自己定义的变量中
                  }
                  if (e.which == 1) {
                      $("#menu").hide();    //如果是点击的鼠标左键,则隐藏菜单
                  }
           });
    
       })
   }
});

虽然这个代码可以初步的让你实现监听鼠标右键,并且获取到当前行的数据, 但是在实际运用的过程中我发现他的代码有一些问题没有注意到,就是在我们点击layui 表格表头进行排序的时候, 鼠标右键就失效了,经过一番查阅 我看到layui 有一个监听表格排序的事件就是下面这个

//监听排序事件 
table.on('sort(test)', function(obj){ //注:sort 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
  console.log(obj.field); //当前排序的字段名
  console.log(obj.type); //当前排序类型:desc(降序)、asc(升序)、null(空对象,默认排序)
  console.log(this); //当前排序的 th 对象
 
  //尽管我们的 table 自带排序功能,但并没有请求服务端。
  //有些时候,你可能需要根据当前排序的字段,重新向服务端发送请求,从而实现服务端排序,如:
  table.reload('idTest', {
    initSort: obj //记录初始排序,如果不设的话,将无法标记表头的排序状态。
    ,where: { //请求参数(注意:这里面的参数可任意定义,并非下面固定的格式)
      field: obj.field //排序字段
      ,order: obj.type //排序方式
    }
  });
  
  layer.msg('服务端排序。order by '+ obj.field + ' ' + obj.type);
});

将这段代码加到你的layui初始函数里面, 鼠标右键就又可以生效了,

但是 这里会出现一个很严重的BUG,就是你鼠标右键获取的值并不是你当前行的值,所以解决方法就是
在获取表格数据的哪里加下面一段代码

$(this).addClass('layui-table-click').siblings().removeClass('layui-table-click');

就是选中当前行的意思

然后获取的时候按选中的行来获取数据就OK了

要实现这个功能,你可以通过以下步骤进行操作: 1. 给你的 table 绑定右键菜单事件,可以使用 jQuery 的 `contextmenu` 事件来实现,代码如下: ``` $('table').on('contextmenu', 'tr', function(e) { // 阻止默认的右键菜单弹出 e.preventDefault(); // 获取当前行的数据 var data = $(this).data('data'); // 显示右键菜单 showMenu(e.pageX, e.pageY, data); }); ``` 2. 编写 `showMenu` 函数来显示右键菜单,代码如下: ``` function showMenu(x, y, data) { // 创建菜单元素 var menu = $('<div class="menu"></div>'); // 添加菜单选项 menu.append('<div class="menu-item">编辑</div>'); menu.append('<div class="menu-item">删除</div>'); // 设置菜单样式 menu.css({ 'position': 'fixed', 'top': y + 'px', 'left': x + 'px' }); // 添加菜单到页面 $('body').append(menu); } ``` 3. 设置菜单的样式和行为,代码如下: ``` // 菜单样式 .menu { position: fixed; background-color: #fff; border: 1px solid #ccc; box-shadow: 0 0 5px rgba(0,0,0,.2); z-index: 9999; } .menu-item { padding: 5px 10px; cursor: pointer; } .menu-item:hover { background-color: #f5f5f5; } // 菜单行为 $('body').on('click', '.menu-item', function() { var text = $(this).text(); // 根据菜单选项执行不同的操作 if (text === '编辑') { // 编辑操作 } else if (text === '删除') { // 删除操作 } // 隐藏菜单 $('.menu').remove(); }); ``` 4. 最后,你需要在每行数据中添加相应的数据,代码如下: ``` <table> <tr data-data="{id: 1, name: '张三', age: 20}"> <td>1</td> <td>张三</td> <td>20</td> </tr> <tr data-data="{id: 2, name: '李四', age: 30}"> <td>2</td> <td>李四</td> <td>30</td> </tr> ... </table> ``` 这样,你就可以在鼠标右键点击 table 中的一条数据时,弹出一个菜单选项了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值