基于javascript实现的搜索时自动提示功能


Posted in Javascript onDecember 26, 2014

当在数据量不是很大,而且没有后端对应的功能接口的时候,一些简单的搜索功能基本上是前端去实现的,正好最近用到,写了一个,贴出来和大家分享:

效果图:

基于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 相关文章推荐
js replace正则表达式应用案例讲解
Jan 17 Javascript
js浮点数精确计算(加、减、乘、除)
Dec 26 Javascript
JQuery对表格进行操作的常用技巧总结
Apr 23 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
Sep 25 Javascript
JS模式之单例模式基本用法
Jun 30 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 Javascript
微信小程序开发之路由切换页面重定向问题
Sep 18 Javascript
vue.js高德地图实现热点图代码实例
Apr 18 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
JavaScript在web自动化测试中的作用示例详解
Aug 25 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 Javascript
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
基于jquery实现发送文章到手机的代码
Dec 26 #Javascript
jQuery中ajax的post()方法用法实例
Dec 26 #Javascript
jQuery中ajax的get()方法用法实例
Dec 26 #Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
Dec 26 #Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 #Javascript
基于javascript的COOkie的操作实现只能点一次
Dec 26 #Javascript
jQuery中ajax的load()方法用法实例
Dec 26 #Javascript
You might like
咖啡与牛奶
2021/03/03 冲泡冲煮
使用PHP维护文件系统
2006/10/09 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
Javascript实现打鼓效果
2021/01/29 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
Python闭包思想与用法浅析
2018/12/27 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python类如何定义私有变量
2020/02/03 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
Python datetime模块的使用示例
2021/02/02 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
实习生自我评价
2014/01/18 职场文书
质量管理标语
2014/06/12 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
高一军训决心书
2015/02/05 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL