输入自动完成类

本文介绍了一个基于 JavaScript 的自动完成输入控件的实现方案,该控件类似 IE 地址栏的功能,可根据用户输入提供匹配建议。文章详细解释了控件的工作原理,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 <HTML>
 <HEAD>
  <TITLE>AutoComplete</TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
 </HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--

/**  
**    ==================================================================================================  
**    ClassName    :CLASS_AUTOCOMPLETE  
**    Intro        :a control similar IE Address Bar
**    Example    :  
      Ver        : 0.31
    ---------------------------------------------------------------------------------------------------  
 
     nick:<INPUT size=30 name=q autolist='ba|ttyp|"|tt|typ|中国上海市|www.baidu.com|www.google.con|jimao8|中国|中|中国上海'>

     <SCRIPT LANGUAGE="JavaScript">
     <!--
        var acbar = new CLASS_AUOTCOMPLETE();
            acbar.setup(document.all.q);
     //-->

    < /SCRIPT>
 
    ---------------------------------------------------------------------------------------------------  
**    Author    :ttyp  
**    Email     :ttyp@21cn.com  
**    Date      :2006-12-25
**    ==================================================================================================  
**/  
 
    function CLASS_AUOTCOMPLETE(ID){
        
        var me = this;

        this.contain = document.getElementById("__auto_complete_contain");
        this.handle = null;
        this.dropdown = false;
        this.stopChange = false;
        this.line = 0;
        this.selectIndex = -1;
        this.id = "";

        if(ID!=null&&typeof(ID)!=undefined){
            this.id = ID;
        }else{
            this.id = getNewId();
        }

        function getNewId(){
            return "ID_" + Math.random().toString().substring(2)
        }

        this.add = function(s){
            this.list[this.list.length] = s;
        }

        this.sort = function(){
            //sort
            shellSort(this.list);
        }

        this.show = function(flag){
            
            var contain = me.contain;               
            if(contain==null||typeof(contain)=="undefined"){
                contain = document.createElement("div");
                var body = document.body;
                if(typeof(body)!="undefined"){
                    body.appendChild(contain);
                }
                me.contain = contain;
            }
            if(flag==undefined||flag==null){
                flag = true;
            }

            if(flag){                
                var w=1000,h=50,l,t;
                me.line = 0;
                if(me.handle!=null&&typeof(me.handle)!="undefined"){
                    var v = me.handle.value;
                    if(me.list!=null&&typeof(me.list)!="undefined"){
                        for(var i=contain.childNodes.length-1;i>=0;i--){
                            contain.removeChild(contain.childNodes[i]);
                        }
                        var index = 0;
                        for(var i=0;i<me.list.length;i++){
                            if(me.list[i].indexOf(v)==0){
                                var oo = document.createElement("div");
                                contain.appendChild(oo);
                                oo.innerText = me.list[i];
                                oo.style.height = "16px";
                                oo.style.width = "100%";
                                oo.style.overflow="hidden";
                                oo.style.lineHeight="120%";
                                oo.style.cursor = "hand";
                                oo.style.fontSize = "9pt";
                                oo.style.padding = "0 2 0 2";
                                oo.setAttribute("accoc",me.id + "__auto_complete_contain");
                                oo.setAttribute("sIndex",index);
                                oo.onmouseover = function(){
                                    this.style.background = "highlight";
                                    this.style.color = "highlighttext";
                                    if(me.selectIndex>=0&&me.selectIndex!=this.getAttribute("sIndex")*1){
                                        var oc = me.contain.childNodes[me.selectIndex];
                                            oc.style.background = "#ffffff";
                                            oc.style.color = "#000000";
                                    }
                                    me.selectIndex = this.getAttribute("sIndex")*1;
                                }
                                oo.onmouseout = function(){
                                    this.style.background = "#ffffff";
                                    this.style.color = "#000000";
                                }
                                oo.onclick=function(){
                                    me.stopChange = true;
                                    me.handle.value = this.innerText;
                                    me.stopChange = false;
                                    me.show(false);                                     
                                    var r =me.handle.createTextRange();
                                    r.moveStart('character',me.handle.value.length);
                                    r.collapse(true);
                                    r.select();
                                    me.handle.focus();
                                    me.selectIndex = -1;
                                }
                                oo.onfocus = function(){ me.handle.focus();}
                                oo.onblur = me.handle.onblur;
                                oo.onselectstart  = function(){return false;};
                                me.line++;
                                index++;
                            }
                        }

                    }
                    w = me.handle.getBoundingClientRect().right - me.handle.getBoundingClientRect().left;
                    l = me.handle.getBoundingClientRect().left-2;
                    t = me.handle.getBoundingClientRect().bottom-2;
                }

                h = (me.line>6?6*16:me.line*16)+2;

                contain.style.position = "absolute";
                contain.style.top = t;
                contain.style.left = l;
                contain.style.width = w;
                contain.style.height = h;
                contain.style.overflowY  = "auto";
                contain.style.overflowX = "hidden";      
                contain.style.backgroundColor = "#ffffff";
                contain.style.border = "1px solid black";
                contain.setAttribute("accoc",me.id + "__auto_complete_contain");
                contain.onblur = me.handle.onblur;
                contain.onselectstart  = function(){return false;}
                contain.onfocus = function(){ me.handle.focus();}

                if(me.line<=0){
                    contain.style.display = "none";
                }else{
                    contain.style.display = "";
                }

            }else{
                contain.style.display = "none";
            }
            this.dropdown = flag;
        }

        this.filter = function(){
            this.show();
        }

        this.getText = function(){
            if(me.selectIndex>=0){
                me.handle.value = me.contain.childNodes[me.selectIndex].innerText;
                me.show(false);
                var r =me.handle.createTextRange();
                r.moveStart('character',me.handle.value.length);
                r.collapse(true);
                r.select();
                me.handle.focus();
                me.selectIndex = -1;
            }
        }    

        this.move = function(flag){
            var osid = me.selectIndex;

            if(me.dropdown==false){
                me.show(true);
            }
            if(flag){
                me.selectIndex++;
            }else{
                me.selectIndex--;
            }
            if(me.selectIndex>me.contain.childNodes.length-1){
                me.selectIndex = 0;
            }
            if(me.selectIndex<0){
                me.selectIndex = me.contain.childNodes.length-1;
            }

            if(osid>=0){
                var d = me.contain.childNodes[osid];
                if(d!=null&&typeof(d)!="undefined"){
                    d.style.background = "#ffffff";
                    d.style.color = "#000000";
                }
            }
            
            if(me.selectIndex>=0){
                var c = me.contain.childNodes[me.selectIndex];
                if(c!=null&&typeof(c)!="undefined"){
                    c.style.background = "highlight";
                    c.style.color = "highlighttext";
                    c.scrollIntoView(false);
                }
            }
        }

        this.setup = function(o){
            
            this.list = o.getAttribute("autolist").split("|");
            //sort
            shellSort(this.list);
            o.setAttribute("accoc",me.id + "__auto_complete_contain");
            this.handle = o;
            o.onpropertychange = function(){            
                if(event.propertyName=="value"){
                    if(me.stopChange==false){
                        me.filter();
                    }
                }
            }
            o.ondblclick = function(){
                me.filter();
            }            
            o.onkeydown= function(){
                switch(event.keyCode){
                    case 38://up
                        me.move(false);
                        break;
                    case 40://down
                        me.move(true);
                        break;
                    case 13:
                        me.getText();
                        break;
                    default:
                        //alert(event.keyCode);
                }
            }
            o.onblur=function(){
                var active = document.activeElement;
                var stopHide = false;

                if(active!=null){
                    var ac = active.getAttribute("accoc");
                    if(ac!=null&&typeof(ac)!="undefined"&&ac==me.id + "__auto_complete_contain"){    
                        stopHide = true;
                    }
                }
                if(stopHide==false){
                    me.show(false);
                }
            }
        }

        function shellSort(arr){
            for (var step = arr.length >> 1; step > 0; step >>= 1){
                for (var i = 0; i < step; ++i){
                    for (var j = i + step; j < arr.length; j += step){
                        var k = j, value = arr[j];
                        while (k >= step && arr[k - step] > value){
                            arr[k] = arr[k - step];
                            k -= step;
                        }
                        arr[k] = value;
                    }
                }
            }
        }
    }
//-->
</SCRIPT>
 <BODY>
 nick:<INPUT size=30 name=q autolist='ba|ttyp|"|tt|typ|中国上海市|jimao8|中国|中|中国上海'>
 addr:<INPUT size=30 name=p autolist='www.baidu.com|www.google.con|www.cnblogs.com/ttyp'>
 <SCRIPT LANGUAGE="JavaScript">
 <!--
    var acbar1 = new CLASS_AUOTCOMPLETE();
        acbar1.setup(document.all.q);
        acbar1.add("hello");
        acbar1.sort();

    var acbar2 = new CLASS_AUOTCOMPLETE();
        acbar2.setup(document.all.p);
 //-->
 </SCRIPT>
 </BODY>
</HTML>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rjzou2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值