JS实现的一个简单的Autocomplete自动完成例子


Posted in Javascript onApril 16, 2014

分享一篇无意间发现的自动完成源码。这里测试的时候使用的是数组,实际使用的时候,我们换成Ajax从服务器端获取的方式就OK了。

提示:可以直接保存到一个html文件中查看效果。

<!doctype html>
<html>
<style>
body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
}
.auto_hidden {
    width:204px;border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    display:none;
}
.auto_show {
    width:204px;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    z-index:9999; /* 设置对象的层叠顺序 */
    display:block;
}
.auto_onmouseover{
    color:#ffffff;
    background-color:highlight;
    width:100%;
}
.auto_onmouseout{
    color:#000000;
    width:100%;
    background-color:#ffffff;
}
</style>
<script language="javascript">
<!--
var $ = function (id) {
    return "string" == typeof id ? document.getElementById(id) : id;
}
var Bind = function(object, fun) {
    return function() {
        return fun.apply(object, arguments);
    }
}
function AutoComplete(obj,autoObj,arr){
    this.obj=$(obj);        //输入框
    this.autoObj=$(autoObj);//DIV的根节点
    this.value_arr=arr;        //不要包含重复值
    this.index=-1;          //当前选中的DIV的索引
    this.search_value="";   //保存当前搜索的字符
}
AutoComplete.prototype={
    //初始化DIV的位置
    init: function(){
        this.autoObj.style.left = this.obj.offsetLeft + "px";
        this.autoObj.style.top  = this.obj.offsetTop + this.obj.offsetHeight + "px";
        this.autoObj.style.width= this.obj.offsetWidth - 2 + "px";//减去边框的长度2px  
    },
    //删除自动完成需要的所有DIV
    deleteDIV: function(){
        while(this.autoObj.hasChildNodes()){
            this.autoObj.removeChild(this.autoObj.firstChild);
        }
        this.autoObj.className="auto_hidden";
    },
    //设置值
    setValue: function(_this){
        return function(){
            _this.obj.value=this.seq;
            _this.autoObj.className="auto_hidden";
        }      
    },
    //模拟鼠标移动至DIV时,DIV高亮
    autoOnmouseover: function(_this,_div_index){
        return function(){
            _this.index=_div_index;
            var length = _this.autoObj.children.length;
            for(var j=0;j<length;j++){
                if(j!=_this.index ){      
                    _this.autoObj.childNodes[j].className='auto_onmouseout';
                }else{
                    _this.autoObj.childNodes[j].className='auto_onmouseover';
                }
            }
        }
    },
    //更改classname
    changeClassname: function(length){
        for(var i=0;i<length;i++){
            if(i!=this.index ){      
                this.autoObj.childNodes[i].className='auto_onmouseout';
            }else{
                this.autoObj.childNodes[i].className='auto_onmouseover';
                this.obj.value=this.autoObj.childNodes[i].seq;
            }
        }
    }
    ,
    //响应键盘
    pressKey: function(event){
        var length = this.autoObj.children.length;
        //光标键"↓"
        if(event.keyCode==40){
            ++this.index;
            if(this.index>length){
                this.index=0;
            }else if(this.index==length){
                this.obj.value=this.search_value;
            }
            this.changeClassname(length);
        }
        //光标键"↑"
        else if(event.keyCode==38){
            this.index--;
            if(this.index<-1){
                this.index=length - 1;
            }else if(this.index==-1){
                this.obj.value=this.search_value;
            }
            this.changeClassname(length);
        }
        //回车键
        else if(event.keyCode==13){
            this.autoObj.className="auto_hidden";
            this.index=-1;
        }else{
            this.index=-1;
        }
    },
    //程序入口
    start: function(event){
        if(event.keyCode!=13&&event.keyCode!=38&&event.keyCode!=40){
            this.init();
            this.deleteDIV();
            this.search_value=this.obj.value;
            var valueArr=this.value_arr;
            valueArr.sort();
            if(this.obj.value.replace(/(^\s*)|(\s*$)/g,'')==""){ return; }//值为空,退出
            try{ var reg = new RegExp("(" + this.obj.value + ")","i");}
            catch (e){ return; }
            var div_index=0;//记录创建的DIV的索引
            for(var i=0;i<valueArr.length;i++){
                if(reg.test(valueArr[i])){
                    var div = document.createElement("div");
                    div.className="auto_onmouseout";
                    div.seq=valueArr[i];
                    div.onclick=this.setValue(this);
                    div.onmouseover=this.autoOnmouseover(this,div_index);
                    div.innerHTML=valueArr[i].replace(reg,"<strong>$1</strong>");//搜索到的字符粗体显示
                    this.autoObj.appendChild(div);
                    this.autoObj.className="auto_show";
                    div_index++;
                }
            }
        }
        this.pressKey(event);
        window.onresize=Bind(this,function(){this.init();});
    }
}
//-->
</SCRIPT>
<body>
<h1 align="center">自动完成函数(Autocomplete Function)</h1>
    <div align="center"><input type="text" style="width:300px;height:20px;font-size:14pt;" id="o" onkeyup="autoComplete.start(event)"></div>
    <div class="auto_hidden" id="auto"><!--自动完成 DIV--></div>
<script>
    var autoComplete=new AutoComplete('o','auto',['b0','b12','b22','b3','b4','b5','b6','b7','b8','b2','abd','ab','acd','accd','b1','cd','ccd','cbcv','cxf']);
</SCRIPT>
</body>
</html>

Javascript 相关文章推荐
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
May 29 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
JS计算距当前时间的时间差实例
Dec 29 Javascript
layui复选框限制选择个数的方法
Sep 18 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 #Javascript
JavaScript面向对象编程入门教程
Apr 16 #Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 #Javascript
jquery实现点击文字可编辑并修改保存至数据库
Apr 15 #Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
Apr 15 #Javascript
JS比较2个日期间隔的示例代码
Apr 15 #Javascript
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 #Javascript
You might like
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
javascript正则表达式总结
2016/02/29 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
vue的安装及element组件的安装方法
2018/03/09 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
javascript实现日历效果
2019/06/17 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
Python中捕获键盘的方式详解
2019/03/28 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
家长给学校的建议书
2014/05/15 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
病人慰问信范文
2015/02/15 职场文书
小学思品教学反思
2016/02/20 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python