原生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,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...
随机推荐
- 如何使用google解决问题
如何使用google解决问题 redguardtoo著 文章选自2004年<程序员>杂志第8期P56 前面收集了篇如何问问题的文章就是<学会提问>http://blog.pro ...
- [Bzoj3209]花神的数论题(数位dp)
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 1182[Submit][Status][Disc ...
- 通过继承Thread类来创建多线程 关键词 start
// 代码 public class MyThread extends Thread { public void run(){ for(int i=0;i<10;i++){ try { Thre ...
- js的基础(平民理解的执行上下文/调用堆栈/内存栈/值类型/引用类型)
与以前的切图比较,现在的前端开发对js的要求似乎越来越高,在开发中,我们不仅仅是要知道如何运用现有的框架(react/vue/ng), 而且我们对一些基础的知识的依赖越来越大. 现在我们就用平民的方法 ...
- ModelAndView对象作用
ModelAndView ModelAndView对象有两个作用: 作用一 :设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别) ModelAndView mv = ...
- Nexus搭建Maven私有仓库
原文:http://blog.csdn.net/rickyit/article/details/54927101 前言 Nexus Repository Manager is a Javaapplic ...
- 运维平台之CMDB系统建设
CMDB是运维的基础核心系统,所有的元数据和共享数据管理源,类似于业务中的账号平台的作用.本篇文章,我将从概念篇.模型篇.到实现与实施篇具体的进行阐述. CMDB也称配置管理,配置管理一直被认为是 I ...
- Deepin-我为什么推荐它!
针对Win上的开发软件,大部分都需要密匙或者破解,而Deepin不敢说一应俱全,但全沾边是没问题的 无论是编程.娱乐还是其它的,基本上都可以做到,而且它还应用了Crossover来兼容大部分的Win软 ...
- 实战c++中的string系列--指定浮点数有效数字并转为string
上一篇博客讲了好几种方法进行number到string的转换,这里再单独说一下float或是double到string的转换. 还是处于控件显示的原因.比方说要显示文件的大小,我们从server能够获 ...
- Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用
Android有这几种方式,可以提交数据到服务器,他们是怎么使用的呢,这里我们来探讨一下. 这里的例子用的都是提交客户端的用户名及密码,同时本节用到的StreamTools.readInputStre ...