基于前端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 ...
随机推荐
- arm-linux-gcc中对“inline”的处理
C++对于关键字“inline”的处理大家都知道,C++编译器对于内敛函数就是把它当做一个宏展开.这样可能会增加程序的代码量,却可以减少程序入栈和出栈的此处,从而影响程序的执行速度.但是,C语言中扩展 ...
- MVC引用CSS文件の正确姿势
你的css文件目录结构: 将路径写入BundleConfig规则中: using System.Web; using System.Web.Optimization; namespace XXXX { ...
- C# 使用Salt+Hash来为密码加密
(一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到 ...
- http协议请求规则与dotNet的解析
请求方法URI协议/版本 请求的第一行是"方法URL议/版本":GET/sample.jsp HTTP/1.1 以上代码中"GET"代表请求方法,"/ ...
- BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整
Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了 ...
- Discuz <= 7.2 SQL注入漏洞详情
在<高级PHP应用程序漏洞审核技术>[1]一文里的"魔术引号带来的新的安全问题"一节里,有 提到通过提取魔术引号产生的“\”字符带来的安全问题,同样这个问题在这里又一次 ...
- Cloud Insight 现在已经支持监控 Cassandra 啦!
Cassandra 是什么? Apache Cassandra 以其可扩展性和容错分布式数据库系统而被人所熟知.Cassandra 起源于Facebook 最初创建于 Amazon Dynamo 和谷 ...
- 李洪强iOS开发-网络新闻获取数据思路回顾
李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据 1.1 定义类方法返回单例对 ...
- [wikioi]最长严格上升子序列
http://wikioi.com/problem/1576/ 经典的动态规划.我写了个o(n^2)的DP方法. PPT:http://wenku.baidu.com/view/bd290294dd8 ...
- Android 你应该知道的学习资源 进阶之路贵在坚持
1.国外教程网站 Android Developers Blog 不解释 vogella 很不错的网站,免费的,包含android的教程也比较全面,并且教程中经常引用大牛blog,会有很多意外发现.代 ...