曾经爱晚人








永远自由的心

[转]输入框自动完成,模仿IE的,支持FireFox

1、可设置自动完成功能所提示的字符。
2、可用方向键选择。
3、如果选择的当前元素为首元素,则按上(方向键)则会自动跳到末元素。
4、如果选择的当前元素为末元素,则按下(方向键)则会自动跳到首元素。
5、当获取值为空时,自动隐藏 自动完成TIP的容器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<style>
body,div 
{
font
-family:verdana;
line
-height:100%;
font
-size:9pt;
}

input 
{
width:300px;
}

h1 
{
text
-align:center;
font
-size:2.2em;
}

#divf 
{
margin:10px;
font
-size:0.8em;
text
-align:center;
}

#divc 
{
border:1px solid #
333333;
}

.des 
{
width:500px;
background
-color:lightyellow;
border:1px solid #
333;
padding:20px;
margin
-top:20px;
}

.mouseover 
{
color:#ffffff;
background
-color:highlight;
width:
100%;
cursor:
default;
}

.mouseout 
{
color:#
000000;
width:
100%;
background
-color:#ffffff;
cursor:
default;
}

</style>
<SCRIPT LANGUAGE="JavaScript">
<!--

// script by blueDestiny
//
 Email : blueDestiny [at] 126 . com

// Object: jsAuto
//
 browser: ie, mf.
//
 example:

// step1 : 
//
 create autocomplete container, return object and bind event to the object, and 
//
/create a new jsAuto instance:
//
 <div id="divautocomplete"></div>
//
 var autocomplete = new jsAuto("autocomplete","divautocomplete")
//
 handle event:
//
 autocomplete.handleEvent(value, returnObjectID)
//
 <input id="rautocomplete" onkeyup="autocomplete.handleEvent(this.value,"ratocomplete",event)>

// step2 :
//
 add autocompete item:
//
 autocomplete.item(string)
//
 string must be a string var, you can split the string by ","
//
 autocomplete.item("blueDestiny,never-online,csdn,blueidea")

// http://www.never-online.com

//instanceName为你生成的实例名,objID为监听的对象ID
//
具体请见最下面的例子

function jsAuto(instanceName,objID)
{
    
//初始化成员;
    //_msg: 预先实例化的自动完成内容
    this._msg = [];
    
this._x = null;
    
this._o = document.getElementById( objID );
    
if (!this._o) return;
    
//标志flag的缩写
    this._f = null;
    
//instanceName的缩写
    this._i = instanceName;
    
    
//返回的对象
    //returnObject
    this._r = null;
    
//按上下键时,得到当前的mouseover是第几个元素
    //count
    this._c = 0;
    
//是否可以执行按上下键
    //selectflag
    this._s = false;
    
//Value的缩写
    this._v = null;
    
//初始化object的状态
    this._o.style.display = "none";
    
this._o.style.position = "absolute";
    
this._o.style.zIndex = "9999";
    
this._offset=function(e)
    
{
        
var t = e.offsetTop;
        
var l = e.offsetLeft;
        
var w = e.offsetWidth;
        
var h = e.offsetHeight;

        
while(e=e.offsetParent)
        
{
            t
+=e.offsetTop;
            l
+=e.offsetLeft;
        }

        
return {
            t : t,
            l : l,
            w : w,
            h : h
        }

    }

    
return this;
}
;

//触发的按上下的键盘事件
//
效率不算高,可优化

jsAuto.prototype.directionKey
=function() with (this)
{
    
var e = _e.keyCode ? _e.keyCode : _e.which;
    
var l = _o.childNodes.length;
    (_c
>l-1 || _c<0? _s=false : "";

    
if( e==40 && _s )
    
{
        _o.childNodes[_c].className
="mouseout";
        (_c 
>= l-1? _c=0 : _c ++;
        _o.childNodes[_c].className
="mouseover";
    }

    
if( e==38 && _s )
    
{
        _o.childNodes[_c].className
="mouseout";
        _c
--<=0 ? _c = _o.childNodes.length-1 : "";
        _o.childNodes[_c].className
="mouseover";
    }

    
if( e==13 )
    
{
        
if(_o.childNodes[_c] && _o.style.display=="block")
        
{
            _r.value 
= _x[_c];
            _o.style.display 
= "none";
        }

    }

    
if!_s )
    
{
        _c 
= 0;
        _o.childNodes[_c].className
="mouseover";
        _s 
= true;
    }

}
}
;

// mouseEvent.
//
 鼠标事件

jsAuto.prototype.domouseover
=function(obj) with (this)
{
    _o.childNodes[_c].className 
= "mouseout";
    _c 
= 0;
    obj.tagName
=="DIV" ? obj.className="mouseover" : obj.parentElement.className="mouseover";
}
}
;
jsAuto.prototype.domouseout
=function(obj)
{
    obj.tagName
=="DIV" ? obj.className="mouseout" : obj.parentElement.className="mouseout";
}
;
jsAuto.prototype.doclick
=function(msg) with (this)
{
    
if(_r)
    
{
        _r.value 
= msg;
        _o.style.display 
= "none";
    }

    
else
    
{
        alert(
"javascript autocomplete ERROR :\n\n can not get return object.");
        
return;
    }

}
}
;

// object method;
//
 对象的原型方法

// 添加项目;
//
 可以用英文,分割
//
 JK说的是对的,我当初也是不想用逗号的
//
 如果你不想用,分割,可自己改写这里

jsAuto.prototype.item
=function(msg)
{
    
if( msg.indexOf(",")>0 )
    
{
        
var arrMsg=msg.split(",");
        
for(var i=0; i<arrMsg.length; i++)
        
{
            arrMsg[i] 
? this._msg.push(arrMsg[i]) : "";
        }

    }

    
else
    
{
        
this._msg.push(msg);
    }

    
this._msg.sort();
}
;
jsAuto.prototype.append
=function(msg) with (this)
{
    _i 
? "" : _i = eval(_i);
    _x.push(msg);
    
var div = document.createElement("DIV");

    
//bind event to object.
    div.onmouseover = function(){_i.domouseover(this)};
    div.onmouseout 
= function(){_i.domouseout(this)};
    div.onclick 
= function(){_i.doclick(msg)};
    
var re  = new RegExp("(" + _v + ")","i");
    div.style.lineHeight
="140%";
    div.className 
= "mouseout";
    
if (_v) div.innerHTML = msg.replace(re , "<strong>$1</strong>");
    div.style.fontFamily 
= "verdana";

    _o.appendChild(div);
}
}
;
jsAuto.prototype.display
=function() with(this)
{
    
if(_f&&_v!="")
    
{
        
var l = _offset(_r);
        _o.style.left 
= l.l;
        _o.style.width 
= l.w;
        _o.style.top 
= l.t + l.h;
        _o.style.display 
= "block";
        _o.style.display 
= "block";
    }

    
else
    
{
        _o.style.display
="none";
    }

}
}
;
jsAuto.prototype.handleEvent
=function(fValue,fID,event) with (this)
{
    
var re;
    _e 
= event;
    
var e = _e.keyCode ? _e.keyCode : _e.which;
    _x 
= [];
    _f 
= false;
    _r 
= document.getElementById( fID );
    _v 
= fValue;
    
// 这里用eval,返回生成的实例对象。
    _i = eval(_i);
    re 
= new RegExp("^" + fValue + """i");
    _o.innerHTML
="";

    
for(var i=0; i<_msg.length; i++)
    
{
        
if(re.test(_msg[i]))
        
{
            _i.append(_msg[i]);
            _f 
= true;
        }

    }


    _i 
? _i.display() : alert("can not get instance");

    
if(_f)
    
{
        
// 触发上下键盘的事件
        if((e==38 || e==40 || e==13))
        
{
            _i.directionKey();
        }

        
else
        
{
            _c
=0;
            _o.childNodes[_c].className 
= "mouseover";
            _s
=true;
        }

    }

}
}
;
window.onerror
=new Function("return true;");
//-->
</SCRIPT>
</HEAD>
<BODY>
<div id="divc">
<!--this is the autocomplete container.-->
</div>
<h1>Autocomplete Function</h1>
<div align="center">
<input onkeyup="jsAutoInstance.handleEvent(this.value,'auto',event)" id="auto">
</div>
<div id="divf">
Power By Miracle, never
-online
</div>
<SCRIPT LANGUAGE="JavaScript">
<!--
var jsAutoInstance = new jsAuto("jsAutoInstance","divc");
jsAutoInstance.item(
"a-start,b-start,c-start,d-start,e-start,f-start,g-start,h-start,i-start,j-start,k-start,l-start,m-start,n-start,o-start,p-start,q-start,r-start,s-start,t-start,u-start,v-start,w-start,x-start,y-start,z-start,z-start");
jsAutoInstance.item(
"blueDestiny");
jsAutoInstance.item(
"BlueMiracle,Blue");
jsAutoInstance.item(
"angela,geniuslau");
jsAutoInstance.item(
"never-online");
//-->
</SCRIPT>
</BODY>
</HTML>
</body></html>

posted on 2006-06-28 12:35  e旋风  阅读(1827)  评论(1编辑  收藏  举报

导航