JavaScript实现前端实时搜索功能


Posted in Javascript onMarch 26, 2020

大部分页面都具备搜索功能。而作为前端,我们的目的只是将用户输入的内容返回给后台而后呈现反馈数据给用户,具体实现如下:

1.基本布局:

<div class="searcher">
 <p class="searcher-main">
 <i><img src="img/icon/icon-search-map.png"/></i>
 <input class="searcher-text" placeholder="请输入档口名称"></input>
 </p>
 <p class="searcher-cancel">取消</p>
</div>

这里涉及一个问题如何将搜索图标放入input中,网上有相关资料不做赘述:

.searcher {
 background: rgba(255, 255, 255, 0);
 position: fixed;
 z-index: 999;
 width: 100%;
 height: 6rem;
 text-align: center;
 font-size: 1.6rem;
 }

 .searcher-main {
 background: #F4F4F4;
 position: absolute;
 left: 50%;
 top: 1.2rem;
 margin-left: -45%;
 border-radius: 1.6rem;
 width: 80%;
 height: 3rem;
 line-height: 3rem;
 } 

 .searcher-text {
 width: 80%;
 text-align: center;
 border: none;
 outline: none;
 background: #F4F4F4;
 }

 .searcher-cancel {
 position: absolute;
 width: 10%;
 height: 3rem;
 line-height: 3rem;
 color: #929292;
 top: 1.2rem;
 right: 1rem;
 }

2.step-1:

JavaScript实现前端实时搜索功能

3.js部分

这里要安利IE9以上的oninput事件

onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效。
onkeydown/onkeypress/onkeyup在处理复制、粘贴、拖拽、长按键(按住键盘不放)等细节上并不完善。
onpropertychange不用考虑是否失去焦点,不管js操作还是键盘鼠标手动操作,只要HTML元素属性发生改变即可立即捕获到。遗憾的是,onpropertychange为IE专属的。

//监听input框,实时渲染
 $('.searcher-text').on('input', function() {
 initSearchList();
 });

JQ一般都是用这种+=html的方法,虽然累赘不过通过url或者tag标签里属性传参较容易理解。

//渲染搜索列表
 function initSearchList() {
 var List = $('.searcher-land ul');
 var params = {};
 //搜索过滤字符
 var SEARCH_KEY = $('.searcher-text').val()
 params['action'] = 'get_search_key_list';
 params['market_iid'] = 1001;
 params['search_type'] = TYPE;
 params['search_key'] = replaceIllegalStr(SEARCH_KEY);

 epm.ajax(params, function(result) {
 console.log(result);
 console.log(TYPE)
 var html = '';
 List.html('');
 //有结果
 if(result.data.length > 0) {
  $.each(result.data, function(index, value) {
  goodName = value['goods_name'];
  shopName = value['shop_name'];
  //判断Name类型
  itemName = (goodName) ? goodName : shopName;
  html += '<li class="goods-list">' + itemName + '</li>'
  });
  $('.searcher-list').html(html);
 }
 //无结果
 else {
  html = '<div class="no-goods">暂时无法找到此选项~</div>';
  $('.searcher-list').html(html);
 }
 });
 }

注意这里有一个replaceIllegalStr()方法,类似正则,目的是过滤掉一些无用的符号以免给后端接收数据带来不必要的麻烦。

function replaceIllegalStr(str) {
 var reg;
 var illegal_list = ["/", "\\",
 "[", "]",
 "{", "}",
 "<", ">",
 "<", ">",
 "「", "」",
 ":", ";",
 "、", "•",
 "^", "'", "\"",
 "\r", "\r\n", "\\n", "\n"];
 for (var i = 0; i < illegal_list.length; i++) {
 if (str.indexOf(illegal_list[i]) >= 0) {
 if (illegal_list[i] == '\\' || illegal_list[i] == '[') {
 reg = new RegExp('\\' + illegal_list[i], "g");
 } else {
 reg = new RegExp(illegal_list[i], "g");
 }
 str = str.replace(reg, '');
 }
 }
 return str.trim();
}

4.step-2:

JavaScript实现前端实时搜索功能

5.缓存

这里我们将点击的数据保存在本地缓存里,供取用呈现:
注: epm是自己封装的一个方法与属性的对象

//设置缓存
 epm.setLocalItem = function(key, value) {
 if (window.localStorage) {
 localStorage.setItem(key, value);
 } else {
 //后备方案
 setCookie(key, value);
 }
 };
//提取缓存
 epm.getLocalItem = function(key) {
 if (window.localStorage) {
 return localStorage.getItem(key);
 } else {
 //后备方案
 return getCookie(key);
 }
 };
//删除缓存
 epm.removeLocalItem = function(key) {
 if (window.localStorage) {
 localStorage.removeItem(key);
 } else {
 //后备方案
 removeCookie(key);
 }
 };

JavaScript实现前端实时搜索功能

6.step-3

得到点击的相应的缓存词里的value,再次发送ajax:

JavaScript实现前端实时搜索功能

更多搜索功能实现的精彩文章,请点击专题:javascript搜索功能汇总 进行学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JqGrid web打印实现代码
May 31 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
九种原生js动画效果
Nov 11 Javascript
jQuery选择器及jquery案例详解(必看)
May 20 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
JS中使用正则表达式g模式和非g模式的区别
Apr 01 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
详解vue中移动端自适应方案
May 05 Javascript
公众号SVG动画交互实战代码
May 31 Javascript
js实现点击烟花特效
Oct 14 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 #Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
Apr 18 #Javascript
Angularjs根据json文件动态生成路由状态的实现方法
Apr 17 #Javascript
微信小程序实战之轮播图(3)
Apr 17 #Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
Jun 19 #Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 #Javascript
微信小程序教程系列之新建页面(4)
Apr 17 #Javascript
You might like
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
小程序自定义日历效果
2018/12/29 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Django中使用group_by的方法
2015/05/26 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Python装饰器原理与用法分析
2018/04/30 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
经典c++面试题六
2012/01/18 面试题
视图的作用
2014/12/19 面试题
计算机本科生自荐信
2013/10/15 职场文书
关于母亲节的感言
2014/02/04 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
征兵宣传标语
2014/06/20 职场文书
森林防火宣传标语
2014/06/27 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python