效果:可通过按钮和输入文字进行组合条件筛选
这里使用数组模拟后台数据(可用ajax请求后台数据):
-
var person = [
-
{ name: '王小妹', src: '', sex: 'male', des: '漂亮的妹子'},
-
{ name: '金小妹', src: '', sex: 'male', des: '漂亮的程序媛'},
-
{ name: '陈小华', src: '', sex: 'female', des: '相互学习'},
-
{ name: '马爱国', src: '', sex: 'female', des: '喜欢猫'},
-
{ name: '邓小茜', src: '', sex: 'male', des: '喜欢运动'},
-
{ name: '马学习', src: '', sex: 'female', des: '喜欢看书'}
-
]
'
运行
主要html结构:
-
<body>
-
<div class="wrapper">
-
<div class="search">
-
<input type="text" placeholder="请输入用户名" id="input">
-
<ul id="searchUl">
-
<li class="active" sex = "all">All</li>
-
<li sex = "male">Male</li>
-
<li sex = "female">Female</li>
-
</ul>
-
</div>
-
<div class="userList">
-
<ul id="list">
-
<!-- 方便确定插入数据的结构和样式 -->
-
<!-- <li><img src="./images/" alt="">
-
<span class="name">小航</span>
-
<span class="des">描述</span>
-
</li> -->
-
</ul>
-
</div>
-
</div>
-
-
<script src="./"></script>
-
</body>
思路及js核心代码:
1)渲染dom结构:使用forEach()方法遍历数组,找出符合条件的数据,有几条数据就生成几个li结构代码块,然后把生成的li结构插入ul中去;
-
var listUl = document.getElementById('list');
-
var oInp = document.getElementById('input');
-
var sUl = document.getElementById('searchUl');
-
-
-
//渲染dom结构,遍历数组使用forEach()方法
-
function render(list){
-
var str = '';
-
list.forEach(function(ele, index){
-
str += '<li><img src="./images/'+ ele.src +'" alt="">\
-
<span class="name">'+ ele.name +'</span>\
-
<span class="des">'+ ele.des +'</span></li>';
-
});
-
listUl.innerHTML = str;
-
}
2)单一输入框文字筛选:获取input输入框输入的值,绑定一个oninput事件,使用使用数组过滤筛选方法filter()进行文本过滤;
-
//获取input输入的value值,需绑定一个oninput事件,获取过滤结果后渲染
-
oInp.oninput = function(){
-
var text = this.value;
-
// = ; //组合条件筛选
-
render(filterText(text, person)); //单一筛选、渲染
-
//render(addFn(filterFn,person)); //组合条件筛选、渲染
-
}
-
-
//输入文本过滤
-
function filterText(val, arr){
-
var fArr = arr.filter(function(ele, index){
-
if(ele.name.indexOf(val) !== -1){
-
return true;
-
}
-
})
-
return fArr;
-
}
3)单一点击按钮筛选:点击事件绑定在ul上,由li触发
-
//绑定点击事件
-
sUl.addEventListener('click', function(e){
-
if(e.target.tagName == 'LI'){
-
var sex = e.target.getAttribute('sex');
-
// = ('sex'); //组合条件筛选
-
document.getElementsByClassName('active')[0].className = ''; //修改点击按钮的样式
-
e.target.className = 'active'; //修改点击按钮的样式
-
render(filterSex(sex, person));
-
//render(addFn(filterFn,person));//组合条件筛选、渲染
-
}
-
})
-
-
//点击按钮筛选
-
function filterSex(sex, arr){
-
if(sex == 'all'){
-
return arr;
-
}else{
-
var sArr = arr.filter(function(ele, index){
-
if(sex == ele.sex){
-
return true;
-
}
-
})
-
return sArr;
-
}
-
}
4)组合条件筛选:通过两个对象的prop把组合对象(输入框和按钮)和筛选函数联系起来
-
//组合筛选,在一个筛选结果的基础上筛选(修改传入数组arr),参数lastArr上一次筛选返回的数组
-
-
//筛选条件:实现筛选条件的函数
-
var filterFn = {
-
text: filterText,
-
sex: filterSex
-
}
-
-
//筛选条件:之前的筛选的值text、sex 要改为
-
var state = {
-
text: '',
-
sex: 'all'
-
}
-
-
//组合
-
function addFn(obj, arr){
-
var lastArr = arr;
-
for(var prop in obj){
-
lastArr = obj[prop](state[prop], lastArr);
-
console.log(lastArr);
-
}
-
return lastArr;
-
}