原生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,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...
随机推荐
- [Bzoj3668][Noi2014]起床困难综合症(位运算)
3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2612 Solved: 1500[Submit][St ...
- python统一的换行符,实现跨平台
6 PEP 278: Universal Newline Support The three major operating systems used today are Microsoft Wind ...
- hdu 3624 City Planning(暴力,也可扫描线)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志
这一章节我们引入简单的AOP日志实现. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_1; pub ...
- 阅读《Android 从入门到精通》(33)——Intent 分类
Intent 分类 显式 Intent:Intent("android.intent.action.CALL", Uri.parse("tel:" + stri ...
- Please enter a commit message to explain why this merge is necessary.
Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...
- LightOj 1027 A Dangerous Maze【概率】
题目链接:http://www.lightoj.com/volume_showproblem.php? problem=1027 题意: 你面前有n个门,每一个相应一个数字,若为正xi.代表xi分钟后 ...
- sql server 系统常用函数:聚合函数 数学函数 字符串函数 日期和时间函数和自定义函数
一.系统函数 1.聚合函数 聚合函数常用于GROUP BY子句,在SQL Server 2008提供的所有聚合函数中,除了COUNT函数以外,聚合函数都会忽略空值AVG.COUNT.COUNT_BIG ...
- 在CentOS上把MySQL从5.5升级到5.6
在CentOS上把MySQL从5.5升级到5.6 摘要:本文记录了在CentOS 6.3上,把MySQL从5.5.28升级到5.6.19的过程. 1. 概述 在我做的一个项目中,最近我对生产服务器上的 ...
- [iOS]经常使用正則表達式
经常使用正則表達式大全!(比如:匹配中文.匹配html) 匹配中文字符的正則表達式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包含汉字 ...