我在JavaScript / jQuery中搜索时遇到问题。例如,如果我选择“两个服务”和“在线状态”,则此功能将返回全部“两个服务”和所有“在线服务”。
期望的行为有3个部分:
1)对于不同的搜索条件添加(即AND而不是OR)。
2)当搜索条件为空时返回所有记录。
3)从data-name
输入不区分大小写
#search
搜索
$(document).ready(function() {
$("#service").change(function(){ select(); });
$("#search").keyup(function(){ select(); });
$("#status").change(function(){ select(); });
select = function(){
var service = $("#service").val();
var search = $("#search").val();
var status = $("#status").val();
$(".box").hide();
$(".box[data-service='" + service + "']").show();
$(".box[data-search='" + search + "']").show();
$(".box[data-status='" + status + "']").show();
}
});
答案 0 :(得分:1)
您可以尝试这样的事情:
$(document).ready(function() {
$("#service").change(function() {
select();
});
$("#search").keyup(function() {
select();
});
$("#status").change(function() {
select();
});
select = function() {
var service = $("#service").val();
var search = $("#search").val();
var status = $("#status").val();
$(".box").hide();
var boxes = $(".box").filter(function(index) {
return (service === 'all' || $(this).attr("data-service") === service) &&
(!search || $(this).attr("data-name").toLowerCase().indexOf(search.toLowerCase()) >= 0 ) &&
(status === 'all' || $(this).attr("data-status") === status);
});
console.log(boxes);
boxes.show();
}
});
答案 1 :(得分:0)
这里的想法是根据过滤条件的值动态构建选择器。我使用一个对象来包含过滤器值,以便我可以迭代它们并重用属性名称,但是你可以这样做但是你喜欢。
$(document).ready(function() {
$("#service, #status").change(function(){ select(); });
$("#search").keyup(function(){ select(); });
select = function(){
var selectorFilters = {
service: $("#service").val(),
status: $("#status").val()
};
$(".box").hide();
var selector = Object.keys(selectorFilters).reduce(function (sel, currentKey) {
var value = selectorFilters[currentKey];
if (value && value !== "" && value !== "all") {
sel += "[data-" + currentKey + "=" + value + "]";
}
return sel;
}, ".box"); // <-- start with .box and build from there
// will select even if search is partial match, rather than only exact match
$(selector).filter(function (){
var searchValue = $("#search").val().toLowerCase();
return (searchValue === "" || $(this).data("name").toLowerCase().indexOf(searchValue) > -1);
}).show();
}
});