asfman
android developer
posts - 90,  comments - 213,  trackbacks - 0

<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_MSN_MESSAGE 
**    Intro        :a control similar IE Address Bar
**    Example    : 
      Ver        : 0.3
    --------------------------------------------------------------------------------------------------- 
 
     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-22 
**    ================================================================================================== 
**/ 
 
    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];
                    d.style.background = "#ffffff";
                    d.style.color = "#000000";
            }
           
            if(me.selectIndex>=0){
                var c = me.contain.childNodes[me.selectIndex];
                    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>

posted on 2006-12-23 14:51 汪杰 阅读(356) 评论(0)  编辑 收藏 引用 所属分类:
只有注册用户登录后才能发表评论。

<2006年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(15)

随笔分类(1)

随笔档案(90)

文章分类(727)

文章档案(712)

相册

收藏夹

http://blog.csdn.net/prodigynonsense

友情链接

最新随笔

搜索

  •  

积分与排名

  • 积分 - 467489
  • 排名 - 6

最新随笔

最新评论

阅读排行榜

评论排行榜