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 相关文章推荐
js Form.elements[i]的使用实例
Nov 13 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
Dec 12 Javascript
jQuery实现下拉框左右选择的简单实例
Feb 22 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
May 22 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
js H5 canvas投篮小游戏
Aug 18 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
纯原生js实现table表格的增删
Jan 05 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
用 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
php中将网址转换为超链接的函数
2011/09/02 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python换行与不换行的输出实例
2020/02/19 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
学校青年志愿者活动总结
2015/05/06 职场文书
保护环境的宣传语
2015/07/13 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
python基础之类方法和静态方法
2021/10/24 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python