使用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 相关文章推荐
Ext.MessageBox工具类简介
Dec 10 Javascript
javascript中的float运算精度实例分析
Aug 21 Javascript
js获取多个tagname的节点数组
Sep 22 Javascript
javascript文本框内输入文字倒计数的方法
Feb 24 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
Dec 26 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 Javascript
Vue批量图片显示时遇到的路径被解析问题
Mar 28 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文件下载类
2006/12/06 PHP
浅析php创建者模式
2014/11/25 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
网页设计个人找工作求职信
2013/11/28 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
八年级音乐教学反思
2014/01/09 职场文书
档案室主任岗位职责
2014/02/12 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
校园安全标语
2014/06/07 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
2019年大学推荐信
2019/06/24 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL