使用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 相关文章推荐
jQuery 第二课 操作包装集元素代码
Mar 14 Javascript
js 实现菜单上下显示附效果图
Nov 21 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
关于JS中二维数组的声明方法
Sep 24 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
Angular 2.0+ 的数据绑定的实现示例
Aug 09 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
Vuex 模块化使用详解
Jul 31 Javascript
微信小程序聊天功能的示例代码
Jan 13 Javascript
javascript实现计算器功能详解流程
Nov 01 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
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
python print 按逗号或空格分隔的方法
2018/05/02 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python socket 套接字实现通信详解
2019/08/27 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
2014年征兵标语
2014/06/20 职场文书
六年级小学生评语
2014/12/26 职场文书
财务会计求职信范文
2015/03/20 职场文书
2015年采购工作总结
2015/04/10 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
关于Redis的主从复制及哨兵问题
2022/06/16 Redis