基于前端javascript的搜索功能
当在数据量不是很大,而且没有后端对应的功能接口的时候,一些简单的搜索功能基本上是前端去实现的,正好最近用到,写了一个,贴出来和大家分享:
功能描述:
按下键盘后及时搜索条目中的汉字,汉字对应的拼音和号码;
实现思路:
先将条目中的汉字转换成拼音,然后将汉字,拼音,数字拼接成规律的字符串,放入数组,然后每次按下键盘后判断 input 中的值是汉字,拼音,还是数字,然后按固定的规律去循环数组,这样就能找到对应的条目了;
启用方式:
// search-test-inner ---> 最外层div
// search-value ---> input 输入框
// search-value-list ---> 搜索结果显示div
// search-li ---> 搜索条目
new SEARCH_ENGINE("search-test-inner","search-value","search-value-list","search-li");
注意:搜索条目加上两个临时数据,data-name 和 data-phone ,用来存储汉字和数字。
说明:拼音的转换用到了一个叫 jQuery.Hz2Py-min.js 的插件,由于这个插件只能转换 input 里的值,所以代码里多了一个步骤,先将值放入一个临时的 input ,再转换。
HTML:
<div class="search-test-inner"> <div class="search-val-inner">
<input type="text" class="search-value" placeholder="搜索">
<ul class="search-value-list"></ul>
</div> <div class="member-list-inner">
<ul>
<li class="search-li" data-name="战士" data-phone="13914157895">
<span class="phone">13914157895</span>
<span class="name">战士</span>
</li>
<li class="search-li" data-name="牧师" data-phone="15112357896">
<span class="phone">15112357896</span>
<span class="name">牧师</span>
</li>
<li class="search-li" data-name="盗贼" data-phone="13732459980">
<span class="phone">13732459980</span>
<span class="name">盗贼</span>
</li>
<li class="search-li" data-name="德鲁伊" data-phone="18015942365">
<span class="phone">18015942365</span>
<span class="name">德鲁伊</span>
</li>
<li class="search-li" data-name="武僧" data-phone="15312485698">
<span class="phone">15312485698</span>
<span class="name">武僧</span>
</li>
<li class="search-li" data-name="死灵法师" data-phone="13815963258">
<span class="phone">13815963258</span>
<span class="name">死灵法师</span>
</li>
<li class="search-li" data-name="圣骑士" data-phone="13815934258">
<span class="phone">13815934258</span>
<span class="name">圣骑士</span>
</li>
</ul>
</div> </div>
CSS:
* { padding: 0; margin: 0; }
ol , ul { list-style: none; }
body { font-size: 12px; color:#333; }
.search-test-inner { margin: 100px auto; padding: 10px; width: 400px; background: #e0e0e0; border-radius: 10px; box-shadow: 1px 2px 6px #444; }
.search-val-inner { margin-bottom: 20px; padding: 10px; background: #fff; }
.member-list-inner .search-li { padding: 10px; }
.search-value-list { margin-top: 10px; }
.search-value-list li { padding: 5px; }
.member-list-inner .search-li .phone,
.search-value-list li .phone { float: right; }
.search-value { width: 100%; height: 30px; line-height: 30px; }
.tips { font-weight: bold; }
JS:
//---------------------------------------------------【初始化】
function SEARCH_ENGINE(dom,searchInput,searchResultInner,searchList){ //存储拼音+汉字+数字的数组
this.searchMemberArray = []; //作用对象
this.dom = $("." + dom); //搜索框
this.searchInput = "." + searchInput; //搜索结果框
this.searchResultInner = this.dom.find("." + searchResultInner); //搜索对象的名单列表
this.searchList = this.dom.find("." + searchList); //转换成拼音并存入数组
this.transformPinYin(); //绑定搜索事件
this.searchActiveEvent(); } SEARCH_ENGINE.prototype = {
//-----------------------------【转换成拼音,并将拼音、汉字、数字存入数组】
transformPinYin : function(){ //临时存放数据对象
$("body").append('<input type="text" class="hidden pingying-box">');
var $pinyin = $("input.pingying-box"); for(var i=0;i<this.searchList.length;i++){ //存放名字,转换成拼音
$pinyin.val(this.searchList.eq(i).attr("data-name")); //汉字转换成拼音
var pinyin = $pinyin.toPinyin().toLowerCase().replace(/\s/g,""); //汉字
var cnCharacter = this.searchList.eq(i).attr("data-name"); //数字
var digital = this.searchList.eq(i).attr("data-phone"); //存入数组
this.searchMemberArray.push(pinyin + "&" + cnCharacter + "&" + digital);
} //删除临时存放数据对象
$pinyin.remove();
}, //-----------------------------【模糊搜索关键字】
fuzzySearch : function(type,val){
var s;
var returnArray = []; //拼音
if(type === "pinyin"){
s = 0;
}
//汉字
else if(type === "cnCharacter"){
s = 1;
}
//数字
else if(type === "digital"){
s = 2;
} for(var i=0;i<this.searchMemberArray.length;i++){
//包含字符
if(this.searchMemberArray[i].split("&")[s].indexOf(val) >= 0){
returnArray.push(this.searchMemberArray[i]);
}
} return returnArray; }, //-----------------------------【输出搜索结果】
postMemberList : function(tempArray){
var html = ''; //有搜索结果
if(tempArray.length > 0){ html += '<li class="tips">搜索结果(' + tempArray.length + ')</li>'; for(var i=0;i<tempArray.length;i++){
var sArray = tempArray[i].split("&"); html += '<li>';
html += '<span class="phone">' + sArray[2] + '</span>';
html += '<span class="name">' + sArray[1] + '</span>';
html += '</li>';
}
}
//无搜索结果
else{ if($(this.searchInput).val() != ""){
html += '<li class="tips">无搜索结果……</li>';
}else{
this.searchResultInner.html("");
}
}
this.searchResultInner.html(html);
}, //-----------------------------【绑定搜索事件】
searchActiveEvent : function(){ var searchEngine = this; $(document).on("keyup",this.searchInput,function(){ //临时存放找到的数组
var tempArray = []; var val = $(this).val(); //判断拼音的正则
var pinYinRule = /^[A-Za-z]+$/; //判断汉字的正则
var cnCharacterRule = new RegExp("^[\\u4E00-\\u9FFF]+$","g"); //判断整数的正则
var digitalRule = /^[-\+]?\d+(\.\d+)?$/; //只搜索3种情况
//拼音
if(pinYinRule.test(val)){
tempArray = searchEngine.fuzzySearch("pinyin",val);
}
//汉字
else if(cnCharacterRule.test(val)){
tempArray = searchEngine.fuzzySearch("cnCharacter",val);
}
//数字
else if(digitalRule.test(val)){ tempArray = searchEngine.fuzzySearch("digital",val);
}
else{
searchEngine.searchResultInner.html('<li class="tips">无搜索结果……</li>');
} searchEngine.postMemberList(tempArray); });
}
};
基于前端javascript的搜索功能的更多相关文章
- 基于SSM框架web搜索功能的实现
这里适合选用于jsp搭建的网站,数据库采用MySQL 一.HTML <div class="header_search"> <input type="t ...
- Django项目实战 - 搜索功能(转)
首先,前端已实现搜索功能页面, 我们直接写后台逻辑: Q()可以实现 逻辑或的判断, name_ _ icontains 表示 name字段包含搜索的内容,i表示忽略大小写. from djang ...
- 如何在Web前端实现CAD图文字全文搜索功能之技术分享
现状 在CAD看图过程中我们经常会需要用到查找文字的功能,在AutoCAD软件查找一个文字时,可以通过打开左下角输入命令find,输入查找的文字,然后设置查找范围,就可以搜索到需要查询的文字.但在We ...
- Lucene5.5.4入门以及基于Lucene实现博客搜索功能
前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示.摘要截取等也不好实现,所以决定采用Lucene改写博客 ...
- jQuery实现简单前端搜索功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- NET Core2基于RabbitMQ对Web前端实现推送功能
NET Core2基于RabbitMQ对Web前端实现推送功能 https://www.cnblogs.com/Andre/p/10012329.html 在我们很多的Web应用中会遇到需要从后端将指 ...
- 在微信框架模块中,基于Vue&Element前端的后台管理功能介绍
微信开发包括公众号.企业微信.微信小程序等方面的开发内容,需要对腾信的微信API接口进行封装:包括事件.菜单.订阅用户.多媒体文件.图文消息.消息群发.微信支付和企业红包.摇一摇设备.语义理解.微信小 ...
- html中layui+jfinal模板实现前端搜索功能
<input type="text" id="campus" class="layui-input" onkeyup="ck ...
- 原生javascript实现 下拉框搜索功能
由于业务需求,要实现 一个下拉框搜索功能.这个下拉功能和百度的还是有点区别的,百度的是时时与服务器交互的,而这个只是模拟.技术点在于实现 了搜索功能. 未搜索前如下图: 搜索后: <!DOCTY ...
随机推荐
- Python学习_数据处理split方法
用open方法导入文件“sketch.txt”后,用split()方法进行分割: >>> import os >>> os.chdir('C:/Python33/H ...
- C# 获取随机可用端口号
TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号.对于这65536个端口号有以下的使用规定: (1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来 ...
- LED汽车前大灯
一.LED汽车前大灯遇到问题.分析和解决 问题1: 当电源电压增大时,LED等闪烁,而且电源电压增大的越多闪烁的频率越低. 原因分析: 电源电压从12V升高到24V过程中,开关MOS管的Vds增大,Q ...
- 一个奇怪的编码 big5-hkscs
# --*-- coding:utf-8 --*-- import urllib2 import urllib postDict = { 'IsExist_Slt_Part_Id': 'False', ...
- backbone csdn
http://blog.csdn.net/the_fire/article/details/7444067 blog.csdn.net/the_fire/article/details/7445448 ...
- 码云分布式之 Brzo 服务器
摘要: 码云是国内最大的代码托管平台,为了支持更大的用户规模,开发团队也在对一些组件进行大规模的重构. 前言 码云是国内最大的代码托管平台.码云基于 Gitlab 5.5 开发,经过几年的开发已经和官 ...
- queue与topic的技术特点对比
1 queue与topic的技术特点对比 Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状态 to ...
- redis+PHP实现的一个优先级去重队列
主要思路是用一个set做前端去重缓冲, 若干个list做后端的多优先级消息队列, 用一个进程来进行分发, 即从set中分发消息到队列. set缓冲的设计为当天有效, 所以有个零点问题,有可能在零点前s ...
- 一起啃PRML - 1.2.2 Expectations and covariances 期望和协方差
一起啃PRML - 1.2.2 Expectations and covariances 期望和协方差 @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ ...
- [DP] LCS小结
额..失误.. LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. DP.O ...