复杂 header 的排序和搜索问题
Sorting and searching issue with complex header
我有以下 table 标记:
<table class="table listagem-dados filtering-col table-bordered table-striped responsive" cellspacing="0" width="100%" summary="Esta tabela exibe os perfis de usuários existentes e os relaciona com tipos de usuário, tipos de perfil e seus respectivos status.">
<thead>
<tr>
<th></th>
<th id="coluna1">Perfil</th>
<th id="coluna2">Usuário</th>
<th id="coluna3">Tipo Perfil</th>
<th id="coluna4">Status</th>
</tr>
<tr class="filterrow">
<th><i class="material-icons md"></i></th>
<th class="input-filter"><input type="text" class="form-control tchatchaca" placeholder="Buscar por Perfil"></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Usuário">
<option value="">Selecione</option>
<option value="fornecedor">Fornecedor</option>
<option value="Governo">Governo</option>
<option value="Outros Entes">Outros Entes</option>
<option value="Terceirizados">Terceirizados</option>
</select></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Tipo Perfil">
<option value="">Selecione</option>
<option value="Comum">Comum</option>
<option value="Especial">Especial</option>
<option value="Administrativo">Administrativo</option>
</select></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Status">
<option value="">Selecione</option>
<option value="Bloqueado">Bloqueado</option>
<option value="Desbloqueado">Desbloqueado</option>
<option value="Excluido">Excluido</option>
</select></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Desbloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha1 fornecedor"><a href="#nogo">Fornecedor</a></td>
<td headers="linha1 coluna2">Fornecedor</td>
<td headers="linha1 coluna3">Comum</td>
<td headers="linha1 coluna4">Desbloqueado</td>
</tr>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Bloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha2 sisAdm"><a href="#nogo">Administrador do Sistema</a></td>
<td headers="linha2 coluna2">Governo</td>
<td headers="linha2 coluna3">Especial</td>
<td headers="linha2 coluna4">Bloqueado</td>
</tr>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Bloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha2 sisAdm"><a href="#nogo">Administrador do Sistema</a></td>
<td headers="linha2 coluna2">Governo</td>
<td headers="linha2 coluna3">Administrativo</td>
<td headers="linha2 coluna4">Bloqueado</td>
</tr>
</tbody>
</table>
如您所见,在 table 中有 2 行,在 header 中第一行用于标题和排序,第二行用于过滤。一些过滤器将通过 <input type="text">
发生,而其他过滤器将通过 <select>
.
发生
我使用以下代码初始化了数据table。
$(document).ready(function() {
// DataTable
var table = $('table').DataTable({
"language": {
"lengthMenu": "Mostrar _MENU_ registros por página",
"zeroRecords": "Nenhum registro encontrado",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"infoFiltered": "(filtered from _MAX_ total records)"
},
});
// Apply the search
table.columns( '.input-filter' ).every( function () {
var that = this;
$( 'input', this.header() ).on( 'keyup change', function () {
if ( that.search() !== this.value ) {
that
.search( this.value )
.draw();
}
} );
} );
// Apply the search
table.columns( '.select-filter' ).every( function () {
var that = this;
$( 'select', this.header() ).on( 'change', function () {
if ( that.search() !== this.value ) {
that
.search( this.value )
.draw();
} else if ( that.search() !== "" ) {
that
.draw();
}
} );
} );
} );
但默认情况下,DataTables 在 header 的 last/second 行上设置排序。然后我把 "bSortCellsTop": true
放在初始化中:
// DataTable
var table = $('table').DataTable({
"language": {
"lengthMenu": "Mostrar _MENU_ registros por página",
"zeroRecords": "Nenhum registro encontrado",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"infoFiltered": "(filtered from _MAX_ total records)"
},
"bSortCellsTop": true
});
并且排序现在按预期排在第一行。但是搜索根本不起作用。我输入了输入,但没有任何响应。在控制台日志中没有错误。我已经尽力了。我更改了 类、禁用了其他依赖项、获取了最新版本的 Datatable、更改了标签的位置以及许多其他内容。
CAUSE
好像跟complex header, you cannot access header columns that are not used for sorting with columns()
.
SOLUTION
重写你的代码如下:
// Apply the search
$.each($('.input-filter', table.table().header()), function () {
var column = table.column($(this).index());
$( 'input', this).on( 'keyup change', function () {
if ( column.search() !== this.value ) {
column
.search( this.value )
.draw();
}
} );
} );
// Apply the search
$.each($('.select-filter', table.table().header()), function () {
var column = table.column($(this).index());
$( 'select', this).on( 'change', function () {
if ( column.search() !== this.value ) {
column
.search( this.value )
.draw();
} else if ( column.search() !== "" ) {
column
.draw();
}
} );
} );
DEMO
有关代码和演示,请参阅 this jsFiddle。
NOTES
- 对于 DataTables 1.10+
使用 "orderCellsTop": true
而不是 bSortCellsTop
- 最后一个 select 框选项 "Bloqueado" 也显示 "Desbloqueado".
我有以下 table 标记:
<table class="table listagem-dados filtering-col table-bordered table-striped responsive" cellspacing="0" width="100%" summary="Esta tabela exibe os perfis de usuários existentes e os relaciona com tipos de usuário, tipos de perfil e seus respectivos status.">
<thead>
<tr>
<th></th>
<th id="coluna1">Perfil</th>
<th id="coluna2">Usuário</th>
<th id="coluna3">Tipo Perfil</th>
<th id="coluna4">Status</th>
</tr>
<tr class="filterrow">
<th><i class="material-icons md"></i></th>
<th class="input-filter"><input type="text" class="form-control tchatchaca" placeholder="Buscar por Perfil"></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Usuário">
<option value="">Selecione</option>
<option value="fornecedor">Fornecedor</option>
<option value="Governo">Governo</option>
<option value="Outros Entes">Outros Entes</option>
<option value="Terceirizados">Terceirizados</option>
</select></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Tipo Perfil">
<option value="">Selecione</option>
<option value="Comum">Comum</option>
<option value="Especial">Especial</option>
<option value="Administrativo">Administrativo</option>
</select></th>
<th class="select-filter"><select class="form-control" placeholder="Buscar por Status">
<option value="">Selecione</option>
<option value="Bloqueado">Bloqueado</option>
<option value="Desbloqueado">Desbloqueado</option>
<option value="Excluido">Excluido</option>
</select></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Desbloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha1 fornecedor"><a href="#nogo">Fornecedor</a></td>
<td headers="linha1 coluna2">Fornecedor</td>
<td headers="linha1 coluna3">Comum</td>
<td headers="linha1 coluna4">Desbloqueado</td>
</tr>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Bloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha2 sisAdm"><a href="#nogo">Administrador do Sistema</a></td>
<td headers="linha2 coluna2">Governo</td>
<td headers="linha2 coluna3">Especial</td>
<td headers="linha2 coluna4">Bloqueado</td>
</tr>
<tr>
<td>
<input type="checkbox" name="selectButton" value="Fornecedor"/>
<div class="btn-toolbar btn-micro" role="toolbar" aria-label="Ações">
<button type="button" class="btn btn-primary" title="Editar">
<i class="material-icons" aria-label="editar" ></i>
<span>Editar</span>
</button>
<button type="button" class="btn btn-default" title="Bloquear">
<i class="material-icons" aria-label="bloquear"></i>
<span>Bloquear</span>
</button>
<button type="button" class="btn btn-danger" title="Excluir">
<i class="material-icons" aria-label="excluir"></i>
<span>Excluir</span>
</button>
</div>
</td>
<td id="linha2 sisAdm"><a href="#nogo">Administrador do Sistema</a></td>
<td headers="linha2 coluna2">Governo</td>
<td headers="linha2 coluna3">Administrativo</td>
<td headers="linha2 coluna4">Bloqueado</td>
</tr>
</tbody>
</table>
如您所见,在 table 中有 2 行,在 header 中第一行用于标题和排序,第二行用于过滤。一些过滤器将通过 <input type="text">
发生,而其他过滤器将通过 <select>
.
我使用以下代码初始化了数据table。
$(document).ready(function() {
// DataTable
var table = $('table').DataTable({
"language": {
"lengthMenu": "Mostrar _MENU_ registros por página",
"zeroRecords": "Nenhum registro encontrado",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"infoFiltered": "(filtered from _MAX_ total records)"
},
});
// Apply the search
table.columns( '.input-filter' ).every( function () {
var that = this;
$( 'input', this.header() ).on( 'keyup change', function () {
if ( that.search() !== this.value ) {
that
.search( this.value )
.draw();
}
} );
} );
// Apply the search
table.columns( '.select-filter' ).every( function () {
var that = this;
$( 'select', this.header() ).on( 'change', function () {
if ( that.search() !== this.value ) {
that
.search( this.value )
.draw();
} else if ( that.search() !== "" ) {
that
.draw();
}
} );
} );
} );
但默认情况下,DataTables 在 header 的 last/second 行上设置排序。然后我把 "bSortCellsTop": true
放在初始化中:
// DataTable
var table = $('table').DataTable({
"language": {
"lengthMenu": "Mostrar _MENU_ registros por página",
"zeroRecords": "Nenhum registro encontrado",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"infoFiltered": "(filtered from _MAX_ total records)"
},
"bSortCellsTop": true
});
并且排序现在按预期排在第一行。但是搜索根本不起作用。我输入了输入,但没有任何响应。在控制台日志中没有错误。我已经尽力了。我更改了 类、禁用了其他依赖项、获取了最新版本的 Datatable、更改了标签的位置以及许多其他内容。
CAUSE
好像跟complex header, you cannot access header columns that are not used for sorting with columns()
.
SOLUTION
重写你的代码如下:
// Apply the search
$.each($('.input-filter', table.table().header()), function () {
var column = table.column($(this).index());
$( 'input', this).on( 'keyup change', function () {
if ( column.search() !== this.value ) {
column
.search( this.value )
.draw();
}
} );
} );
// Apply the search
$.each($('.select-filter', table.table().header()), function () {
var column = table.column($(this).index());
$( 'select', this).on( 'change', function () {
if ( column.search() !== this.value ) {
column
.search( this.value )
.draw();
} else if ( column.search() !== "" ) {
column
.draw();
}
} );
} );
DEMO
有关代码和演示,请参阅 this jsFiddle。
NOTES
- 对于 DataTables 1.10+ 使用
- 最后一个 select 框选项 "Bloqueado" 也显示 "Desbloqueado".
"orderCellsTop": true
而不是 bSortCellsTop