问题
I'am using bootstrap to draw a table, and I need both search and filter function. But the search function can not work after I add filter function. when I delete the row "", the search function work, but filter function disappear, how the use both the function? Here is the code:
<div id="filter-bar"></div>
<table id="tbl" data-height="299" data-show-toggle="true" data-show-columns="true" data-show-export="true" data-select-item-name="toolbar1">
<thead>
<tr>
<th data-field="id" data-align="right" data-sortable="true">Item ID</th>
<th data-field="name" data-align="center" data-sortable="true">Item Name</th>
<th data-field="price" data-align="" data-sortable="true">Item Price</th>
</tr>
</thead>
</table>
<link rel="stylesheet" href="/static/libs/bootstrap3/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/libs/bootstrap3/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/libs/bootstrap-table-master/src/bootstrap-table.css">
<link rel="stylesheet" href="/static/libs/jasny-bootstrap/css/jasny-bootstrap.min.css">
<link rel="stylesheet" href="/static/libs/bootstrap-table-master/src/extensions/filter/bootstrap-table-filter.css">
<script type="text/javascript" src="/static/libs/jquery2/jquery-2.0.3.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/bootstrap-table.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/filter/bootstrap-table-filter1.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/filter/bootstrap-table-filter.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/filter/bs-table.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/export/bootstrap-table-export.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/export/tableExport.js"></script>
<script type="text/javascript" src="/static/libs/bootstrap-table-master/src/extensions/export/jquery.base64.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#tbl").bootstrapTable({
url: "tbl_data.json",
method: "get",
showFilter: true,
search: true,
queryParams: function (p) {
return{
device: 'iphone',
mdate: '2014-12-13',
};
}
});
});
回答1:
$(document).ready(function () {
(function ($) {
$('#filter').keyup(function () {
var rex = new RegExp($(this).val(), 'i');
$('.searchable tr').hide();
$('.searchable tr').filter(function () {
return rex.test($(this).text());
}).show();
})
}(jQuery));
});
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div class="input-group"> <span class="input-group-addon">Filter</span>
<input id="filter" type="text" class="form-control" placeholder="Type here...">
</div>
<table class="table table-striped">
<thead>
<tr>
<th>Code</th>
<th>Name</th>
<th>Default</th>
<th>Status</th>
</tr>
</thead>
<tbody class="searchable">
<tr>
<td>EUR</td>
<td>EURO</td>
<td></td>
<td>Active</td>
</tr>
<tr>
<td>GBP</td>
<td>Pound</td>
<td></td>
<td>Active</td>
</tr>
<tr>
<td>GEL</td>
<td>Georgian Lari</td>
<td><span class="glyphicon glyphicon-ok"></span>
</td>
<td>Active</td>
</tr>
<tr>
<td>USD</td>
<td>US Dollar</td>
<td></td>
<td>Active</td>
</tr>
</tbody>
</table>
Example From Here
回答2:
i found how to fix it. In file /bootstrap-table/extensions/filter/bootstrap-table-filter.min.js is this code (decompressed):
/*
* bootstrap-table - v1.5.0 - 2014-12-12
* https://github.com/wenzhixin/bootstrap-table
* Copyright (c) 2014 zhixin wen
* Licensed MIT License
*/
! function(a) {
"use strict";
a.extend(a.fn.bootstrapTable.defaults, {
showFilter: !1
});
var b = a.fn.bootstrapTable.Constructor,
c = b.prototype.init,
d = b.prototype.initSearch;
b.prototype.init = function() {
c.apply(this, Array.prototype.slice.apply(arguments));
var b = this;
this.$el.on("load-success.bs.table", function() {
b.options.showFilter && a(b.options.toolbar).bootstrapTableFilter({
connectTo: b.$el
})
})
}, b.prototype.initSearch = function() {
d.apply(this, Array.prototype.slice.apply(arguments)), "server" !== this.options.sidePagination && "function" == typeof this.searchCallback && (this.data = a.grep(this.options.data, this.searchCallback))
}, b.prototype.getData = function() {
return this.searchText || this.searchCallback ? this.data : this.options.data
}, b.prototype.getColumns = function() {
return this.options.columns
}, b.prototype.registerSearchCallback = function(a) {
this.searchCallback = a
}, b.prototype.updateSearch = function() {
this.options.pageNumber = 1, this.initSearch(), this.updatePagination()
}, b.prototype.getServerUrl = function() {
return "server" === this.options.sidePagination ? this.options.url : !1
}, a.fn.bootstrapTable.methods.push("getColumns", "registerSearchCallback", "updateSearch", "getServerUrl")
}(jQuery);
I changed it on this (renamed defined function initSearch to initSearch1):
/*
* bootstrap-table - v1.5.0 - 2014-12-12
* https://github.com/wenzhixin/bootstrap-table
* Copyright (c) 2014 zhixin wen
* Licensed MIT License
*/
! function(a) {
"use strict";
a.extend(a.fn.bootstrapTable.defaults, {
showFilter: !1
});
var b = a.fn.bootstrapTable.Constructor,
c = b.prototype.init,
d = b.prototype.initSearch;
b.prototype.init = function() {
c.apply(this, Array.prototype.slice.apply(arguments));
var b = this;
this.$el.on("load-success.bs.table", function() {
b.options.showFilter && a(b.options.toolbar).bootstrapTableFilter({
connectTo: b.$el
})
})
}, b.prototype.initSearch1 = function() {
d.apply(this, Array.prototype.slice.apply(arguments)), "server" !== this.options.sidePagination && "function" == typeof this.searchCallback && (this.data = a.grep(this.options.data, this.searchCallback))
}, b.prototype.getData = function() {
return this.searchText || this.searchCallback ? this.data : this.options.data
}, b.prototype.getColumns = function() {
return this.options.columns
}, b.prototype.registerSearchCallback = function(a) {
this.searchCallback = a
}, b.prototype.updateSearch = function() {
this.options.pageNumber = 1, this.initSearch1(), this.updatePagination()
}, b.prototype.getServerUrl = function() {
return "server" === this.options.sidePagination ? this.options.url : !1
}, a.fn.bootstrapTable.methods.push("getColumns", "registerSearchCallback", "updateSearch", "getServerUrl")
}(jQuery);
And now both filter and search are working. But it still has a bug, if you use search and then filter or contrariwise.
回答3:
here is my Solution to use the dinamyc filters in bootstrap-table and place it in the ajax submit to the server. Note that the "data" is place in just one field.
Example: Here
<!-- Bootstrap Table Filter Extension Javascript-->
<script src="ex_bootstrap-table-filter.js"></script>
<script src="bootstrap-table-filter.js"></script>
<script src="bs-table.js"></script>
回答4:
I found a solution to this issue, the Searched data object was being reset by the filter plugin. Tracked it down to the bootstrap-table-filter.js file:
//this.data = $.grep(this.options.data, this.searchCallback);
this.data = $.grep(this.data, this.searchCallback);
The searched data is stored in this.data, but the filter was using this.options.data, which is the entire, un-filtered table data object.
Just change it so that the filter search object uses the search processed data object; so just change the parameter from this.options.data to this.data. Easy enough!
来源:https://stackoverflow.com/questions/27838297/how-bootstrap-table-to-use-search-and-filter