使用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 相关文章推荐
JavaScript版代码高亮
Jun 26 Javascript
javascript 四则运算精度修正函数代码
May 31 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
javascript回到顶部特效
Jul 30 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
JS实现数组删除指定元素功能示例
Jun 05 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
解决vue+router路由跳转不起作用的一项原因
Jul 19 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
小程序实现留言板
2018/11/02 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
pandas数据集的端到端处理
2019/02/18 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
基于python plotly交互式图表大全
2019/12/07 Python
利用python 下载bilibili视频
2020/11/13 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
优秀团队获奖感言
2014/02/19 职场文书
努力学习演讲稿
2014/05/10 职场文书
教师节宣传方案
2014/05/23 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
python装饰器代码解析
2022/03/23 Python
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers
使用CSS实现音波加载效果
2023/05/07 HTML / CSS