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控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
解决jquery1.9不支持browser对象的问题
Nov 13 Javascript
javascript动态向网页中添加表格实现代码
Feb 19 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
jQuery实现最简单实用的分秒倒计时
Feb 05 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
详解node服务器中打开html文件的两种方法
Sep 18 Javascript
从vue源码解析Vue.set()和this.$set()
Aug 30 Javascript
angular4强制刷新视图的方法
Oct 09 Javascript
js实现拖拽元素选择和删除
Aug 25 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 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
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
用js重建星际争霸
2006/12/22 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python写入已存在的excel数据实例
2018/05/03 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python获取Pandas列名的几种方法
2019/08/07 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
网络技术支持面试题
2013/04/22 面试题
校运会入场式解说词
2014/02/10 职场文书
个人合作协议书范本
2014/04/18 职场文书
英文道歉信
2015/01/20 职场文书