原生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,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...
随机推荐
- 【.Net Core 学习系列】-- EF Core实践(DB First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...
- Web.config的system.webServer节点与system.web的区别
Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...
- linux的shell的until循环举例说明
执行脚本: sh login.sh user,其中user为第一个参数 如下所示,如果用户‘user’登录,'who | grep "$1"'为true,until循环结束,程序继 ...
- 【scrapy】Item Pipeline
After an item has been scraped by a spider,it is sent to the Item Pipeline which process it through ...
- CentOS 6.x ELK(Elasticsearch+Logstash+Kibana)
CentOS 6.x ELK(Elasticsearch+Logstash+Kibana) 前言 Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案, ...
- Office WORD WPS如何取消拼写检查
1 审阅-修订-修订选项-拼写,全部取消勾选.
- mysql手记
myisam innoDB是mysql经常使用的存储引擎 MyISAM不支持事务.也不支持外键.但其訪问速度快.对事务完整性没有要求. InnoDB存储引擎提供了具有提交.回滚和崩溃恢复能力的事务安全 ...
- windows下 sqlplus / as sysdba 报ora-12560的终极解决方法
windows下 sqlplus / as sysdba 报ora-12560的终极解决方法 本文是原创文章.转载请注明出处:http://blog.csdn.net/msdnchina/articl ...
- DosBox 报错 this program requires dosxnt.exe to be in your path
也就是少了dosxnt.exe文件,能够上网搜索下载,把dosxnt 拷贝到你挂截文件夹下就能够执行 Dosxnt文件下载
- Struts2框架起源
曾经也用过S2SH框架做过几个项目,都不是工作中的,学习WEB开发的时候接触的第一套框架也是S2SH,可是工作之后一直没实用到S2SH 框架进行开发. 感觉曾经用这个框架的时候根本没有深入去了解这个框 ...