仿百度输入框智能提示的js代码


Posted in Javascript onAugust 22, 2013

最近客户需求老是变更,不过有些是因为客户催得急,我没有那么快能完成,所以先做了一个雏形给他们,后来再慢慢改。比如雏形那里我做了一个下拉列表给他们,事实上他们的数据有200多条,用个下拉列表的话很不现实,你能找那么多?而且那个下拉列表该有多长啊?所以很自然的,我想到了百度那个智能提示的功能。

参考了一下之前忘记是哪位大侠写的东西,他的是使用百度api的,为了简单起见,我把数据都定在了js那里,这样看官们容易理解一些。

还是整个代码考上来吧,代码不长。考了一下之前忘记是哪位大侠写的东西,他的是使用百度api的,为了简单起见,我把数据都定在了js那里,这样看官们容易理解一些。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        .search
        {
            left: 0;
            position: relative;
        }
        #auto_div
        {
            display: none;
            width: 300px;
            border: 1px #74c0f9 solid;
            background: #FFF;
            position: absolute;
            top: 24px;
            left: 0;
            color: #323232;
        }
    </style>
    <script src="jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        //测试用的数据
        var test_list = ["小张", "小苏", "小杨", "老张", "老苏", "老杨", "老爷爷", "小妹妹", "老奶奶", "大鹏", "大明", "大鹏展翅", "你好", "hello", "hi"];
        var old_value = "";
        var highlightindex = -1;   //高亮
        //自动完成
        function AutoComplete(auto, search, mylist) {
            if ($("#" + search).val() != old_value || old_value == "") {
                var autoNode = $("#" + auto);   //缓存对象(弹出框)
                var carlist = new Array();
                var n = 0;
                old_value = $("#" + search).val();
                for (i in mylist) {
                    if (mylist[i].indexOf(old_value) >= 0) {
                        carlist[n++] = mylist[i];
                    }
                }
                if (carlist.length == 0) {
                    autoNode.hide();
                    return;
                }
                autoNode.empty();  //清空上次的记录
                for (i in carlist) {
                    var wordNode = carlist[i];   //弹出框里的每一条内容
                    var newDivNode = $("<div>").attr("id", i);    //设置每个节点的id值
                    newDivNode.attr("style", "font:14px/25px arial;height:25px;padding:0 8px;cursor: pointer;");
                    newDivNode.html(wordNode).appendTo(autoNode);  //追加到弹出框
                    //鼠标移入高亮,移开不高亮
                    newDivNode.mouseover(function () {
                        if (highlightindex != -1) {        //原来高亮的节点要取消高亮(是-1就不需要了)
                            autoNode.children("div").eq(highlightindex).css("background-color", "white");
                        }
                        //记录新的高亮节点索引
                        highlightindex = $(this).attr("id");
                        $(this).css("background-color", "#ebebeb");
                    });
                    newDivNode.mouseout(function () {
                        $(this).css("background-color", "white");
                    });
                    //鼠标点击文字上屏
                    newDivNode.click(function () {
                        //取出高亮节点的文本内容
                        var comText = autoNode.hide().children("div").eq(highlightindex).text();
                        highlightindex = -1;
                        //文本框中的内容变成高亮节点的内容
                        $("#" + search).val(comText);
                    })
                    if (carlist.length > 0) {    //如果返回值有内容就显示出来
                        autoNode.show();
                    } else {               //服务器端无内容返回 那么隐藏弹出框
                        autoNode.hide();
                        //弹出框隐藏的同时,高亮节点索引值也变成-1
                        highlightindex = -1;
                    }
                }
            }
            //点击页面隐藏自动补全提示框
            document.onclick = function (e) {
                var e = e ? e : window.event;
                var tar = e.srcElement || e.target;
                if (tar.id != search) {
                    if ($("#" + auto).is(":visible")) {
                        $("#" + auto).css("display", "none")
                    }
                }
            }
        }
        $(function () {
            old_value = $("#search_text").val();
            $("#search_text").focus(function () {
                if ($("#search_text").val() == "") {
                    AutoComplete("auto_div", "search_text", test_list);
                }
            });
            $("#search_text").keyup(function () {
                AutoComplete("auto_div", "search_text", test_list);
            });
        });
    </script>
</head>
<body>
    <div class="search">
        <input type="text" id="search_text" />
        <div id="auto_div">
        </div>
    </div>
</body>
</html>

大家复制代码的时候记得把jquery带上,不然出错了又要来骂娘了……

说说主要的思路吧。

首先,把数据弄成一个js数组,然后遍历这个数组,每一条数据生成一个div,然后添加到auto_div这个div里,还要设置一下鼠标移过高亮,移开恢复正常,以及点击的时候自动填上文本框里,还有鼠标在网页点击的时候列表框会消失——当然还有更多细节要注意,这里只是举个例子。怎样让文本框里的文本改变的时候就触发AutoComplete事件呢?用onchange?错,onchange是文本框失去光标的时候才会触发,所以使用keyup事件会好一点。

别的不多说,代码也不难看懂,原理也很简单。我要强调的一点是,像这种智能提示功能可能有些新手会想到用模糊搜索,当文本框里的文本改变的时候就去查一下数据库,把返回的数据列出来——这是不好的做法,我不说他错误因为这样确实可行,但是这会给服务器造成太大的负担,每改变一下文本就查一下数据库,就好像我每要一样东西就要向你问一下一样,倒不如你一次把它们全给我,我要什么自己选。当然凡事都有两面性,把所有数据一次性查出来的后果是耗内存,大数据不建议这样做,这种做法适用于大部分情况,因为大部分情况都不是大数据——大数据的,另想它法。

最后说说我的感受:之前面试过前端工程师,那时候人家觉得我还嫩,确实那时候特嫩。现在,我在前端的领域正开始慢慢强大起来,虽然公司没有前端工程师,但是我还是觉得前端很重要,我要合理运用前端来解决一些用前端很简单就能解决的问题,而不是丢给后台来处理。

在公司做着做着,虽然跟别人学到的东西不多,但是需求来了,自己想办法以及在网上找一些解决方案,自己也学到不少东西。继续做,加油!

Javascript 相关文章推荐
jquery插件之easing 动态菜单
Aug 21 Javascript
javascript中使用css需要注意的地方小结
Sep 01 Javascript
php对mongodb的扩展(初识如故)
Nov 11 Javascript
iframe里的页面禁止右键事件的方法
Jun 10 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
jQuery on()方法示例及jquery on()方法的优点
Aug 27 Javascript
JavaScript中Function函数与Object对象的关系
Dec 17 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
Apr 04 Javascript
JS实现查找数组中对象的属性值是否存在示例
May 24 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 #Javascript
JavaScript中的eval()函数详解
Aug 22 #Javascript
from 表单提交返回值用post或者是get方法实现
Aug 21 #Javascript
jquery重新播放css动画所遇问题解决
Aug 21 #Javascript
JS性能优化笔记搜索整理
Aug 21 #Javascript
JS检测图片大小的实例
Aug 21 #Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 #Javascript
You might like
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
详解python的数字类型变量与其方法
2016/11/20 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
Python字典对象实现原理详解
2019/07/01 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python 实现数组相减示例
2019/12/27 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
参观考察邀请函范文
2014/01/29 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
司考复习计划
2015/01/19 职场文书
小学教师岗位职责
2015/04/02 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python