使用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 面向对象编程基础:封装
Aug 21 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
May 23 Javascript
javascript预加载图片、css、js的方法示例介绍
Oct 14 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
javascript实现当前页导航激活的方法
Feb 27 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
Aug 24 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
原生JS实现在线问卷调查投票特效
Jan 03 Javascript
详解react-redux插件入门
Apr 19 Javascript
Vue多组件仓库开发与发布详解
Feb 28 Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 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/10/09 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
php两种无限分类方法实例
2015/04/21 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
取得父标签
2006/11/14 Javascript
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
javascript数组详解
2014/10/22 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python同时替换多个字符串方法示例
2019/09/17 Python
Python:slice与indices的用法
2019/11/25 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
python xlsxwriter模块的使用
2020/12/24 Python
学年自我鉴定范文
2013/10/01 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
Java异常处理try catch的基本用法
2021/12/06 Java/Android