使用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无法执行的解决办法
Feb 25 Javascript
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
Sep 30 Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
javascript中的事件代理初探
Mar 08 Javascript
JQuery实现带排序功能的权限选择实例
May 18 Javascript
JavaScript的函数式编程基础指南
Mar 19 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
Jul 05 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
Element InputNumber 计数器的实现示例
Aug 03 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
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
基于Jquery的简单图片切换效果
2011/01/06 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
python实现360的字符显示界面
2014/02/21 Python
python获取从命令行输入数字的方法
2015/04/29 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Zabbix实现微信报警功能
2016/10/09 Python
Python读写docx文件的方法
2018/05/08 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
keras导入weights方式
2020/06/12 Python
为什么相对PHP黑python的更少
2020/06/21 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
什么是测试驱动开发(TDD)
2012/02/15 面试题
优秀的茶餐厅创业计划书
2014/01/03 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
我的画教学反思
2014/04/28 职场文书
公司放假通知范文
2015/04/14 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android
详解Python中*args和**kwargs的使用
2022/04/07 Python