使用Bootstrap typeahead插件实现搜索框自动补全的方法


Posted in Javascript onJuly 07, 2016

这就是贴代码的坏处之一:搜索框快被网友玩儿坏了!!!有故意输入空格的,有输入or 1=1的,有alert的,有html乱入的.......而且好像还在玩儿,随他们去吧,只要开心就好。

使用Bootstrap typeahead插件实现搜索框自动补全的方法

在项目中,经常会用到输入框的自动补全功能,就像百度、淘宝等搜索框一样:当用户输入首字母、关键词时,后台会迅速将与此相关的条目返回并显示到前台,以便用户选择,提升用户体验。当然本项目的补全功能和这些大厂的技术是没有可比性的,但用于站内搜索也是绰绰有余了。

接触到的自动补全插件主要有两个:autocomplete和typeahead。本站使用的是typeahead.

jQueryUI-Autocomplete

自动补全插件-bootstrap-3-typeahead

使用Bootstrap typeahead插件实现搜索框自动补全的方法

相关参数说明:

source:function(query,process){}。query表示当前文本输入框中的字符串,可在该方法中通过ajax向后台请求数据(数组形式的json对象),然后将返回的对象作为process的参数;

formatItem:function(item){}。对返回数据的具体某个json对象转化为字符串格式,用以显示在提示列表中,返回值:字符串;

setValue:function(item) {}。选中提示列表某项时,设置文本输入框中显示的值以及实际需要获取的值。返回值格式:{'data-value':item["输入框显示值的 item属性"],'real-value':item["实际需要获取值的item属性"]},后期可通过文本输入框的real-value属性获取该 值;

items:自动完成提示的最大结果集数量,默认:8;

minLength:当前文本输入框中字符串达到该属性值时才进行匹配处理,默认:1;

delay:指定延时毫秒数后,才正真向后台请求数据,以防止输入过快导致频繁向后台请求,默认:500

具体代码如下:

首先引入js文件

<script src="~/Scripts/jquery-1.9.0.js"></script> 
<script src="~/Scripts/bootstrap.js"></script> 
<script src="~/Content/js/bootstrap3-typeahead.js"></script>

Html代码:

<form id="searchform" class="navbar-form navbar-right" role="search" target="_blank" method="get" action="/Search/Index">
<div class="form-group">
<input type="text" id="searchWords" name="searchWords" class="form-control" data-provide="typeahead" autocomplete="off" placeholder="请输入要搜索关键词">
</div>
<button type="submit" class="btn" id="searchbtn">
搜索
</button>
</form>

处理相关搜索词的js:

//搜索自动补全;给搜索框注册自动联想完成事件
autoComplete: function () {
jQuery('#searchWords').typeahead({
source: function (query, process) {
//query是输入值
jQuery.getJSON('/Search/GetHotSearchItems', { "query": query }, function (data) {
process(data);
});
},
updater: function (item) {
return item.replace(/<a(.+?)<\/a>/, ""); //这里一定要return,否则选中不显示
},
afterSelect: function (item) {
//选择项之后的时间,item是当前选中的项
alert(item);
},
items: 8, //显示8条
delay: 500 //延迟时间
});
},

后台处理 /Search/GetHotSearchItems:

#region 2.0 jquery typeahead插件异步获取搜索热词、自动补全搜索框; ActionResult GetHotSearchItems()
/// <summary>
/// 2.0 jquery typeahead插件异步获取搜索热词、自动补全搜索框>
/// 每搜索一次就将此次用户搜索的详情入库>
/// 定时任务每隔10分钟统计一次各搜索词的次数、将统计信息更新到SearchRank表
/// </summary>
/// <returns>JSON</returns>
public ActionResult GetHotSearchItems()
{
//2.1 先获取当前搜索词"query"
string query = Request["query"];
//2.2 从数据库中查询此字段的热词集合
IBLL.ISearchRankService hotService = OperateHelper.Current.serviceSession.SearchRankService;
//2.3 从数据库中检索出包含此搜索词的热词集合,并按搜索次数排序,将数据返回给typeahead.js
List<SearchRank> hotList = hotService.GetDataListBy(s => s.KeyWord.Contains(query), s => s.SearchTimes);
if (hotList != null)
{
var list1 = hotList.Select(h => new
{
name = h.KeyWord,
times = h.SearchTimes
}).ToList();
ArrayList list2 = new ArrayList();
int i = 1;
foreach (var item in list1)
{
list2.Add(string.Format("<a class=\"cat\" href=\"#\">{0}</a>{1}", i, item.name));
i++;
}
return Json(list2, JsonRequestBehavior.AllowGet);
}
else
{
return Json("", JsonRequestBehavior.AllowGet);
}
} 
#endregion

就先这样吧。

Javascript 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
js 内存释放问题
Apr 25 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
Apr 03 Javascript
jquery日历插件e-calendar升级版
Nov 10 Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 Javascript
微信小程序 chooseImage选择图片或者拍照
Apr 07 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
Jan 21 Javascript
vue组件化中slot的基本使用方法
May 01 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 Javascript
JS ES6异步解决方案
Apr 29 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
Apr 16 #Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
Jul 07 #Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
Jul 07 #Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 #Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 #Javascript
jQuery+ajax实现实用的点赞插件代码
Jul 06 #Javascript
jQuery操作iframe中js函数的方法小结
Jul 06 #Javascript
You might like
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
Python入门篇之编程习惯与特点
2014/10/17 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python各层级目录下import方法代码实例
2020/01/20 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python中内建模块collections如何使用
2020/05/27 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
html5启动原生APP总结
2020/07/03 HTML / CSS
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
linux面试题参考答案(4)
2013/01/28 面试题
暑假实习求职信范文
2013/09/22 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
客房服务员岗位职责
2015/02/09 职场文书
家长反馈意见及建议
2015/06/03 职场文书
招商银行工作证明
2015/06/17 职场文书