使用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 相关文章推荐
js tab效果的实现代码
Dec 26 Javascript
JS 对输入框进行限制(常用的都有)
Jul 30 Javascript
解析URI与URL之间的区别与联系
Nov 22 Javascript
javascript 实现 原路返回
Jan 21 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
JSON字符串和对象相互转换实例分析
Jun 16 Javascript
jQuery条件分页 代替离线查询(附代码)
Aug 17 jQuery
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 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
聊天室php&amp;mysql(四)
2006/10/09 PHP
PHP的开发框架的现状和展望
2007/03/16 PHP
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
总结js函数相关知识点
2018/02/27 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
python同时遍历两个list用法说明
2020/05/02 Python
python中pow函数用法及功能说明
2020/12/04 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
C#面试题
2016/05/06 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
公务员职业生涯规划书范文  
2014/01/19 职场文书
实习生求职自荐信
2014/02/07 职场文书
爱我中华演讲稿
2014/05/20 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
婚育证明格式
2015/06/17 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL