使用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 相关文章推荐
Google Suggest ;-) 基于js的动态下拉菜单
Oct 11 Javascript
JQuery onload、ready概念介绍及使用方法
Apr 27 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
JS获取iframe中longdesc属性的方法
Apr 01 Javascript
javascript限制文本框输入值类型的方法
May 07 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 Javascript
js实现对ajax请求面向对象的封装
Jan 08 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
JS内部事件机制之单线程原理
Jul 02 Javascript
7个你应该知道的JS原生错误类型
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
生成静态页面的PHP类
2006/11/25 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
php获取系统变量方法小结
2015/05/29 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python3调用R的示例代码
2018/02/23 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
pandas 空数据处理方法详解
2019/11/02 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
C#中的验证控件有几种
2014/03/08 面试题
兼职业务员岗位职责
2014/01/01 职场文书
高一家长会邀请函
2014/01/12 职场文书
打架检讨书2000字
2014/02/22 职场文书
小学运动会班级口号
2014/06/09 职场文书
家具商场的活动方案
2014/08/16 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
委托书的样本
2015/01/28 职场文书
投资入股协议书
2016/03/22 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang