原生JavaScript实战之搜索框筛选功能
成品图如下所示:

先搭建HTML结构:
<div class="wrapper">
<div class="sWrapper">
<input type="text" class="sText">
<span class="btn" sex="m">Male</span>
<span class="btn" sex="f">Female</span>
<span class="btn active" sex="a">All</span>
</div>
<div class="flWrapper">
<ul> </ul>
</div>
</div>
CSS样式:
*{
margin:0px;
padding: 0px;
list-style: none;
}
.wrapper{
width:400px;
padding:10px 15px;
border: 1px solid #ccc;
margin:100px auto 0px;
border-radius: 6px;
}
img{
width: 50px;
height: 50px;
}
.wrapper .sWrapper{
margin-bottom: 20px;
}
.wrapper .sWrapper input{
width: 220px;
height: 25px;
padding-left:10px;
outline: none;
border-radius:4px;
border:1px solid #777;
}
.wrapper .sWrapper .btn{
cursor: pointer;
color: #3c8dff;
padding: 0px 5px;
border-radius: 4px;
}
.wrapper .sWrapper .btn.active{
color:#fff;
background: #3c8dff;
}
.wrapper .flWrapper ul li {
position: relative;
padding-left: 60px;
padding-top: 10px;
padding-bottom: 10px;
border-bottom:1px solid #999;
}
.wrapper .flWrapper ul li img {
position: absolute;
left: 0px;
top:10px;
}
.wrapper .flWrapper ul li .name {
margin-bottom: 10px;
}
.wrapper .flWrapper ul .li .des {
font-size: 12px;
color:#666;
}
需要创建的文件如下所:


开始写JS代码:
index.js
//模拟后端传过来的数据表单
var personArr = [
{ name: '大钢铁', src: '../ing/gnag.PNG', des: 'I am gang', sex: 'm', age: 18 },
{ name: '小女巫', src: '../ing/fei.PNG', des: 'I am fei', sex: 'f', age: 19 },
{ name: '大绿巨', src: '../ing/lv.PNG', des: 'I am lv', sex: 'm', age: 20 },
{ name: '大寡妇', src: '../ing/hei.PNG', des: 'I am black wife', sex: 'f', age: 23 },
{ name: '小队长', src: '../ing/mei.PNG', des: 'I am USA', sex: 'm', age: 24 },
]; // 初始变量
var oUl = document.getElementsByTagName('ul')[0];
var oInput = document.getElementsByTagName('input')[0]; store.subscribe(function () {
RenderPage(lastFilterArr(personArr));
}); // 数据渲染页面
function RenderPage(data) {
//遍历数组长度添加
var htmlStr = ''; //设定一个空字符串接收数据
oUl.innerHTML = ''; //
data.forEach(function (ele, index, self) {
htmlStr = htmlStr + '<li><img src="' + ele.src + '"><img/><p class="name">' + ele.name + '</p><p class="dse">' + ele.des + '</p></li>';
//遍历出后端里面的数据
});
oUl.innerHTML = htmlStr; //把数据以HTML形式付给页面
}
RenderPage(personArr);// 执行渲染函数 //添加行为
oInput.oninput = debounce(function () { //输入触发过滤
store.dispatch({ type: 'text', value: this.value });
//传到渲染页面的函数中,重新绘制页面
}, 1000);//最后再加上防抖功能,也就是相当于套上一个定时器,输入文本1秒后再执行搜索 //btn style
var oBtnArr = [].slice.call(document.getElementsByClassName('btn'), 0);
//把btn类数组转为数组 var lastActiveBtn = oBtnArr[2]; oBtnArr.forEach(function (ele, index, self) {
ele.onclick = function () {
changeActive(this);
RenderPage(filterArrBySex(personArr, this.getAttribute('sex')));
store.dispatch({ type: 'sex', value: this.getAttribute('sex') });
//渲染过滤后的性别
}
}); //点击按钮切换样式
function changeActive(curActiveBtn) {
curActiveBtn.className = 'btn active';
lastActiveBtn.className = 'btn';
lastActiveBtn = curActiveBtn;
}
写入过滤函数
文本过滤:
// text -- 根据文本来过滤
function filterArrByText(data, text){
if(!text){ //非文本则返回数据表单
return data;
}else{ //否则进入一下进行过滤
return data.filter(function(ele, index){
return ele.name.indexOf(text) != -1;
//返回indexOf文本不等于-1的文本
//如果输入的文本不在数据表单名字里面indexOf则会返回-1
});
}
}
性别过滤:
// sex -- 根据性别过滤
function filterArrBySex (data, sex){
if(sex == 'a'){
return data;
//如果传入的是a,就返回a
}else{
return data.filter(function (ele, index, self){
return ele.sex == sex;
//如果sex等于传入的sex,就返回相应的sex
})
}
}
合并过滤函数
function combineFilter (config){
return function (data){
for(var prop in config){ //循环过滤这两个函数
//依次过滤这两个函数,先过滤文本数据后返回给data
//data拿到的过滤一次后的数据再次过滤一次把性别再过滤一次
data = config[prop](data, store.getState(prop));
}
return data; //最后过滤完返回出来
}
}
//接收过滤函数传到combineFilter这个文件,接着合并等于lastFilterArr
var lastFilterArr = combineFilter({
text: filterArrByText,
sex: filterArrBySex
})
再加入设计模式
(变量不裸露方便管理)
function createStore (initialState) {
var stata = initialState || {};
var list = [];
//获取
function getState (type) {
return stata[type];
}
//处理
function dispatch (action) {
stata[action.type] = action.value;
//调用之前订阅过的函数
list.forEach(function(ele){
ele();
})
}
//订阅
function subscribe (func) {
list.push(func);
}
return {
getState:getState,
dispatch:dispatch,
subscribe:subscribe
}
}
var store = createStore({text: '', sex: 'a'});
最后再加上防抖功能
//防抖功能,就是搜索框输入文字1秒后再进行搜索
function debounce (handler, delay){
var timer = null;
return function (e) {
var _self = this, _arg = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
handler.apply(_self, _arg);
},delay);
}
}
谢谢观看,有大佬经过请指出意见
原生JavaScript实战之搜索框筛选功能的更多相关文章
- Jquery实现搜索框提示功能
博客的前某一篇文章中http://www.cnblogs.com/hEnius/p/2013-07-01.html写过一个用Ajax来实现一个文本框输入的提示功能.最近在一个管理项目的项目中,使用后发 ...
- PyCharm关闭按两次Shift进入搜索框的功能
1.按Ctrl + Shift + A 弹出搜索框 2.在弹出的搜索框内输入registry(如果汉化了输入“注册”),回车 3.在弹出的窗口中,往下找到“ide.suppress.double.cl ...
- Javascript实例 -- 计时器, 搜索框,selected联动
计时器: <body> <input type="text" id="i1"> <input type="button& ...
- 原生javascript实现 下拉框搜索功能
由于业务需求,要实现 一个下拉框搜索功能.这个下拉功能和百度的还是有点区别的,百度的是时时与服务器交互的,而这个只是模拟.技术点在于实现 了搜索功能. 未搜索前如下图: 搜索后: <!DOCTY ...
- jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能
▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...
- 简单JavaScript语句实现搜索关键字高亮功能
高亮功能主要是指对页面中指定区域的指定文字进行高亮显示,也就是背景着色.一般在搜索结果页面会经常用到这个功能. 下面就为大家提供一种解决方案,用javascript实现. 首先在<head> ...
- 原生JavaScript实现页面回到顶部的功能
/*如果想实现点击一个按钮让滚动条回到最顶部的功能,首先可能就会想到它是从底部位置移动到顶部的位置 它是一个运动的过程,只要知道当前位置(current Position)和想要到达的位置(targe ...
- 原生JavaScript技巧大收集100个
原生JavaScript技巧大收集 1.原生JavaScript实现字符串长度截取function cutstr(str, len) { var temp; var icount = 0; var p ...
- ajax+JQuery实现类似百度智能搜索框
最近再学习ajax,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...
随机推荐
- Java并发包——Atomic操作
Java并发包——Atomic操作 摘要:本文主要学习了Java并发包下的atomic包中有关原子操作的一些类. 部分内容来自以下博客: https://blog.csdn.net/qq_303796 ...
- 1.windows环境搭建
1.安装jdk JDK为开发用到,一般默认带有了jre;jre为运行时用到. 下载java se的jdk,https://www.oracle.com/technetwork/java/javase/ ...
- Building clang on RedHat
http://btorpey.github.io/blog/2015/01/02/building-clang/ clang is a great compiler, with a boatload ...
- SQL Server 2008 R2 安装时提示“Reporting Services目录数据库文件存在”
打开MSSQL数据库管理系统的安装目录,例如: X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA. 其中 X:\ ...
- Codeforces Round #258 (Div. 2) B. Sort the Array(简单题)
题目链接:http://codeforces.com/contest/451/problem/B --------------------------------------------------- ...
- SQL Server索引原理解析
此文是我之前的笔记整理而来,以索引为入口进行探讨相关数据库知识(又做了修改以让人更好消化).SQL Server接触不久的朋友可以只看以下蓝色字体字,简单有用节省时间:如果是数据库基础不错的朋友,可以 ...
- jsp_类的封装_集合的应用
一.需求分析 做一个jsp页面,动态显示信息表的内容. 1.做一个实体类:StudentInfo(包含4个字段) 2.如图模拟生成3条数据,本质上就是new StudentInfo 3个实例, 每一个 ...
- 关于axis2.1.6与websphere7的包冲突问题的解决方式
1,复制axis2.1.6内的module目录内的全部文件到lib 并改动扩展名为.jar 2,删除module目录(可选,不删除也能够) 3,部署到was 4,设置was相应应用程序的类载入方案为父 ...
- spring依赖注入(反转控制)
SPRING依赖注入机制(反转控制)解析 Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的 Service对象,还是持久层的DAO对象,都可在Spring的 ...
- 浅谈UML学习笔记之用例图
最近一直在学习UML的基础知识,再看完视频之后,并没有很好的总结,在画图的过程中发现了很多的问题,下面是看书的过程自己总结的UML用例图的一点知识,与大家分享一下. 一.概念 用例图是由参与者.用例以 ...