DooIT@江西搜才网

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  51 随笔 :: 17 文章 :: 1435 评论 :: 28 引用

V0.1(2006-11-10)

  • 纯JS,无须再加CSS
  • 支持键盘鼠标
  • 仅IE6+

V0.2(2006-11-16)

  • 修复了多个控件的下拉不隐藏的BUG
  • 修改下拉背景的透明问题

V0.3(2006-12-22)

  • 修复了键盘和鼠标选择的BUG
  • 增加了JS代码添加选项的功能

 V0.31(2006-12-25)

  • 修复了无匹配时下拉后的BUG

 

<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>
欢迎访问江西搜才网
posted on 2006-11-10 17:26 ttyp 阅读(3476) 评论(47)  编辑 收藏 网摘 所属分类: 脚本

评论

#1楼 2006-11-10 18:24 代码乱了      
很不错
  回复  引用  查看    

#2楼 2006-11-16 16:19 代码乱了      
哈哈,昨天用了你的这个脚本做了一个演示控件发在BLog上
本人对js不是太熟悉,我觉得有几个问题:
1.下拉的Div的背景应该改下
2.在多个使用这个类的<input>中会存在冲突,比如当第一个文本框有提示,按道理鼠标点到其他控件上这个下拉框会隐藏,但是当点到另一个使用这个自动完成的类的文本框时前一个下拉框不消失

关注哦

  回复  引用  查看    

#3楼[楼主] 2006-11-16 17:23 ttyp      
@代码乱了
bug已经修复

  回复  引用  查看    

#4楼 2006-11-16 18:28 代码乱了      
@ttyp
果然是js高手啊,敬佩啊!!!

  回复  引用  查看    

#5楼 2006-11-16 18:49 代码乱了      
还有就是用Style定位的时候,可能上一个input的下拉被下面的一个input挡住,不知道如何解决
  回复  引用  查看    

#6楼[楼主] 2006-11-16 18:53 ttyp      
你加句

contain.style.zIndex = 9999;

看看,如果是select那就比较麻烦了

  回复  引用  查看    

#7楼 2006-11-16 19:38 代码乱了      
多谢,我也是这样加的,哈哈
握手

  回复  引用  查看    

#8楼 2006-11-17 00:27 SDF[未注册用户]
seen
欢迎回访我的个人BLOG,
阅读了你的这篇文章,x
My blog:
http://blog.run2me.com/jiangyouxiaozi/

  回复  引用    

继续努力! ^_^
  回复  引用    

#10楼 2007-03-26 07:33 无涯[未注册用户]
发现一处BUG:
在多次反复填写、修改、选取文本框的内容之后,会出现错误
“ ‘style’ 为空或不是对象”。

修正方法:

var oc = me.contain.childNodes[me.selectIndex];
oc.style.background = "#ffffff";
oc.style.color = "#000000";
修改为:
var oc = me.contain.childNodes[me.selectIndex];
if(oc!=null && typeof(oc)!="undefined") //非空检测,无涯增加于2007年3月26日
{
oc.style.background = "#ffffff";
oc.style.color = "#000000";
}

  回复  引用    

#11楼 2007-05-31 16:46 liang[未注册用户]
怎么不是全文匹配,而是从第一个字开始匹配,比如输入“上”,应该“中国上海”“上海滩”都出来不更好??
  回复  引用    

#12楼[楼主] 2007-05-31 16:51 ttyp      
@liang

那很简单的

if(me.list[i].indexOf(v)==0){

改为

if(me.list[i].indexOf(v)>=0){

  回复  引用  查看    

#13楼 2007-07-25 10:28 浩生[未注册用户]
好棒哦!正是我要找的,谢谢啦!
  回复  引用    

发现一个问题,如果将那2个input放到一个form里,同时加一个submit按钮的话。当选择下拉内容并回车的话,页面会提交整个表单。
还请楼主看看如何解决

  回复  引用    

#15楼[楼主] 2007-09-12 16:23 ttyp      
case 13:
me.getText();
event.returnValue = 0;
break;

  回复  引用  查看    

@ttyp
请问放到什么位置呢

  回复  引用    

找到了,谢谢楼主
  回复  引用    

请教楼主,如何可以当点击输入框旁边的button时,输入框不显示自动完成下拉条。
  回复  引用    

我不知道怎么放到FORM里去用,我加把两个INPUT加到FORM就不管用了!

哪位教我一下到底怎么应用这个呀?

  回复  引用    

@懒猫骑士
已经知道怎么用了,谢谢!

  回复  引用    

#21楼 2007-10-17 18:10 andy-go[未注册用户]
http://www.mspoon.com/
我在这个网站首页用了楼主的代码,目的是当用户输入关键字的时候可以自动完成。
但现在碰到个很严重的问题,就是当用户输入或选择关键字后点击“添加关键字”按钮(javascript触发)时,自动完成的下拉框会显示出来

很急,还请楼主帮忙解决一下


  回复  引用    

#22楼[楼主] 2007-10-17 20:02 ttyp      
o.onpropertychange = function(){
if(event.propertyName=="value"){
if(me.stopChange==false){
if(o.value!=""){
me.filter();
}
}
}
}

你这样改吧,原因是因为Form1.TextBoxword.value="";这句修改了内容导致,如果不改上面,这样改也可以

acbar2.stopChange = true;
Form1.TextBoxword.value="";
acbar2.stopChange = false;

  回复  引用  查看    

#23楼 2007-10-18 14:57 andy-go[未注册用户]
@ttyp
问题已解决,非常感谢楼主

  回复  引用    

2个问题
1,请问楼主对于自动完成下拉条无法遮蔽select是如何解决的。
2,我使用了一个.net的textbox控件,同时后台有TextChanged的触发事件,我又加了楼主的自动完成代码。但在使用中发现如果选择自动完成下拉条中的内容的话无法触发TextChanged事件。

  回复  引用    

#25楼[楼主] 2007-11-14 13:31 ttyp      
@卡卡卡卡卡卡
1.这个控件没有遮蔽select的功能,你可以加点非标准代码来控制SELECT的显示和不显示

2.TextChanged是后台事件,你设置了它的AutoPostback属性为true么

  回复  引用  查看    

@ttyp
2。我设置了AutoPostback属性为true,如果不选自动完成列表内容的话TextChanged事件可以正常触发。楼主可以试一下。。

  回复  引用    

请问楼主,如果我要当至少输入一个字符的时候才出现自动完成的下拉选择。应该如何修改代码!???
  回复  引用    

#28楼[楼主] 2007-12-07 09:10 ttyp      
var v = me.handle.value;

后面加上这个看看
if(v.length==0){
flag = false;
return ;
}

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 556840




相关文章:

相关链接: