具有列过滤器下拉列表和多个复选框选择的数据表

Sil*_*rch 7 jquery datatables drop-down-menu

我从joao vitor retamero找到了这个优秀的代码 - 小提琴:https://jsfiddle.net/jvretamero/bv6g0r64/ ,它展示了如何在jquery数据表列过滤器中进行多项选择.但我需要将过滤器容器转换为下拉列表,容器中的每个项目都是一个复选框.是的,有很多人提到这一点,正如我在几个小时的研究中发现的那样.但是我还没有找到任何例子,或者有关如何做到这一点的任何明确解释,尽管许多人说jquery插件是可能的.任何人都可以指出任何例子吗?我不知道如何开始.非常感谢.

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css"></script>

    $(document).ready(function() {
    $('#example').DataTable( {
        initComplete: function () {
            this.api().columns().every( function () {
                var column = this;
                var select = $('<select multiple="multiple"><option value=""></option></select>')
                    .appendTo( $(column.footer()).empty() )
                    .on( 'change', function () {
                        var vals = $('option:selected', this).map(function (index, element) {
                            return $.fn.dataTable.util.escapeRegex($(element).val());
                        }).toArray().join('|');

                        column
                            .search( vals.length > 0 ? '^('+vals+')$' : '', true, false )
                            .draw();
                    } );

                column.data().unique().sort().each( function ( d, j ) {
                    select.append( '<option value="'+d+'">'+d+'</option>' )
                } );
            } );
        }
    } );
} );
Run Code Online (Sandbox Code Playgroud)

Sal*_* CJ 13

试试这个,它不使用任何额外的JS/jQuery库:

// This code has been beautified via http://jsbeautifier.org/ with 2 spaces indentation.
$(document).ready(function() {
  function cbDropdown(column) {
    return $('<ul>', {
      'class': 'cb-dropdown'
    }).appendTo($('<div>', {
      'class': 'cb-dropdown-wrap'
    }).appendTo(column));
  }

  $('#example').DataTable({
    initComplete: function() {
      this.api().columns().every(function() {
        var column = this;
        var ddmenu = cbDropdown($(column.header()))
          .on('change', ':checkbox', function() {
            var active;
            var vals = $(':checked', ddmenu).map(function(index, element) {
              active = true;
              return $.fn.dataTable.util.escapeRegex($(element).val());
            }).toArray().join('|');

            column
              .search(vals.length > 0 ? '^(' + vals + ')$' : '', true, false)
              .draw();

            // Highlight the current item if selected.
            if (this.checked) {
              $(this).closest('li').addClass('active');
            } else {
              $(this).closest('li').removeClass('active');
            }

            // Highlight the current filter if selected.
            var active2 = ddmenu.parent().is('.active');
            if (active && !active2) {
              ddmenu.parent().addClass('active');
            } else if (!active && active2) {
              ddmenu.parent().removeClass('active');
            }
          });

        column.data().unique().sort().each(function(d, j) {
          var // wrapped
            $label = $('<label>'),
            $text = $('<span>', {
              text: d
            }),
            $cb = $('<input>', {
              type: 'checkbox',
              value: d
            });

          $text.appendTo($label);
          $cb.appendTo($label);

          ddmenu.append($('<li>').append($label));
        });
      });
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

CSS

/* Styles for the drop-down. Feel free to change the styles to suit your website. :-) */

.cb-dropdown-wrap {
  max-height: 80px; /* At most, around 3/4 visible items. */
  position: relative;
  height: 19px;
}

.cb-dropdown,
.cb-dropdown li {
  margin: 0;
  padding: 0;
  list-style: none;
}

.cb-dropdown {
  position: absolute;
  z-index: 1;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #fff;
  border: 1px solid #888;
}

/* For selected filter. */
.active .cb-dropdown {
  background: pink;
}

.cb-dropdown-wrap:hover .cb-dropdown {
  height: 80px;
  overflow: auto;
  transition: 0.2s height ease-in-out;
}

/* For selected items. */
.cb-dropdown li.active {
  background: #ff0;
}

.cb-dropdown li label {
  display: block;
  position: relative;
  cursor: pointer;
  line-height: 19px; /* Match height of .cb-dropdown-wrap */
}

.cb-dropdown li label > input {
  position: absolute;
  right: 0;
  top: 0;
  width: 16px;
}

.cb-dropdown li label > span {
  display: block;
  margin-left: 3px;
  margin-right: 20px; /* At least, width of the checkbox. */
  font-family: sans-serif;
  font-size: 0.8em;
  font-weight: normal;
  text-align: left;
}

/* This fixes the vertical aligning of the sorting icon. */
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
  background-position: 100% 10px;
}
Run Code Online (Sandbox Code Playgroud)

演示

https://jsfiddle.net/41vgefnf/1/
https://jsfiddle.net/41vgefnf/6/
https://jsfiddle.net/41vgefnf/8/
https://jsfiddle.net/41vgefnf/9/
https: //jsfiddle.net/41vgefnf/10/

UPDATE

我将过滤器下拉菜单移动到标题,并将下拉菜单设置为更像下拉菜单.(没有JS或jQuery参与下拉功能 ;只有纯CSS和基本动画 - CSS3 transition.)

更新#2

抱歉,我忘记将CSS"激活" class应用于所选项目.

更新#3

Update#2案例相同,但对于下拉菜单包装器.(很抱歉忘记了事情......我编辑的只是为了符合/满足您实际要求的要求/更改.:) 但我认为此更新将是最终版本.)

更新#4

修复了下拉菜单包装器的"活动" 状态更改.

学分

感谢@Giacomo为你的小提琴.=)

  • @Sally CJ再次编辑,这里再次链接到我的贡献:https://jsfiddle.net/w8Lozex7/2/ (2认同)

Gia*_*uti 5

我认为您在用户界面中搜索的是多选。

它实际上并不存在使用复选框进行多选的下拉元素(针对这种交互需求,已经存在多选)。

我认为您需要一种具有更好用户体验的自定义多选功能(而不是像提供的示例中那样的默认选择)。

这是我的目的的小提琴,我知道这不完全是您要的,但是我很想这将在更抽象的层次上满足您的要求。

我所做的就是使用一个名为select2的jquery插件,对增强各种输入元素中的ux和ui很有用。

请检查代码注释的技术性。

https://jsfiddle.net/p1261jby/3/

/*added as resources
https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js
https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css
*/

$(document).ready(function() {
  $('#example').DataTable({
    initComplete: function() {
      this.api().columns().every(function() {
        var column = this;
        //added class "mymsel"
        var select = $('<select class="mymsel" multiple="multiple"><option value=""></option></select>')
          .appendTo($(column.footer()).empty())
          .on('change', function() {
            var vals = $('option:selected', this).map(function(index, element) {
              return $.fn.dataTable.util.escapeRegex($(element).val());
            }).toArray().join('|');

            column
              .search(vals.length > 0 ? '^(' + vals + ')$' : '', true, false)
              .draw();
          });

        column.data().unique().sort().each(function(d, j) {
          select.append('<option value="' + d + '">' + d + '</option>')
        });
      });
      //select2 init for .mymsel class
      $(".mymsel").select2();
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

如果您需要自定义一些参数,这里是Select2文档。 https://select2.org/selections