基于前端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 ...
随机推荐
- html+css篇
一,html语义话标签 http://www.html5jscss.com/html5-semantics-section.html
- [JavaScript] js 迅雷评分效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- csu 10月 月赛 F 题 ZZY and his little friends
一道字典树异或的题,但是数据比较水,被大家用暴力给干掉了! 以前写过一个类似的题,叫做the longest xor in tree: 两个差不多吧! 好久没写字典树了,复习一下! 代码: #incl ...
- eclipse提交本地项目到github
1.在https://github.com new repository 2.在eclipse中new project 比如:Test项目 3.右击"Test"->Te ...
- 最好的程序员都是行动派(成功者不是那些明知赚钱之法还要推三阻四的人。成功者知道轻重缓急,善于把握今天) good
我相信,所有程序员都需要在下面两点之间找到一个良好的平衡: 1.把自己关在一间私密的办公室里,针对你的程序与编译器展开一次亲密对话. 2.出入公众场合,与其他人公开谈论你的程序. 关于这个话题,我已经 ...
- QString的不常见用法
QString str("Hello"); QString str = "Hello"; static const QChar data[4] = { 0x00 ...
- Android内存优化之——static使用篇
在Android开发中,我们经常会使用到static来修饰我们的成员变量,其本意是为了让多个对象共用一份空间,节省内存,或者是使用单例模式,让该类只生产一个实例而在整个app中使用.然而在某些时候不恰 ...
- 17.1.1.1 Setting the Replication Master Configuration 设置复制的master 配置:
17.1.1.1 Setting the Replication Master Configuration 设置复制的master 配置: 在一个复制master,你必须启用binary loggin ...
- XP中IIS“HTTP 500 - 内部服务器错误”解决方法
我先把主要过程叙述一下,叙述完有每个问题的具体操作方法. 今天我在XP上安装IIS,运行网站出现"HTTP 500 - 内部服务器错误". 打开HTML没有问题,打开ASP文件时就 ...
- Android开发学习笔记:浅谈WebView
本文转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页 ...