// 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;
//************************************************************************************
if(_v.length==2 && _v!=_Tmp)
{
searchProduct();
this._msg = [];
jsAutoInstance.item($('returnVal').value);
_Tmp=_v;
}
//************************************************************************************

// 这里用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;");//************************************************************************************function searchProduct()
{
var prdName = $F('auto');
var url = 'ResponseProduct.aspx';
var pars = 'prdName=' + prdName ;var myAjax = new Ajax.Request(
url,
{
method: 'post',
asynchronous: 'false',
parameters: pars,
onComplete: showResponse
});}function showResponse(originalRequest)
{
//put returned XML in the textarea$('returnVal').value = originalRequest.responseText;
}//************************************************************************************//-->
</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
<asp:Label id="Label1" runat="server" Visible="False">Label</asp:Label>
</div>
<input id="returnVal">
<SCRIPT LANGUAGE="JavaScript">
<!--
var jsAutoInstance = new jsAuto("jsAutoInstance","divc");
//************************************************************************************
//jsAutoInstance.item(BaseXmlDom.xml);
//************************************************************************************//-->
</SCRIPT>
</BODY>
</HTML>

解决方案 »

  1.   

    惭愧,那段autocomplete是我写的,效率和可操作性,都不如我现在做着的这个autocomplete,过阵子把代码贴出来吧。现在代码基本完成了的。上次有个网友也是用ajax读的数据,其实每次读数据之后,都得clear一次,否则会一次次的堆起来的
      

  2.   

    我也做了个根据拼音实现动态查找的东西,每输入一个字符,就利用xmlhttp,到后台读取相应的数据,然后返回,在前台把返回的数据处理后,放到一个select里面,这样每写一个字符就要操作一回数据库,不知道这样合不合适?
      

  3.   

    一次加载700条数据到客户端,但是如果一次性 实例化到对象 jsAutoInstance.item("暂存数据")来取,也会很慢的。
     如果用户输入之前相同的关键字,那么根暂存的关键字,在客户端缓存中索引对应的数据,然后实例化对象 jsAutoInstance.item("暂存数据");
      

  4.   

    那就不用数组,就用字符串,用正则来match,然后join一下,再把“,”给replace成html代码,直接放到显示区域里面,这样速度应该不会太慢
      

  5.   

    to zhaoxiaoyang(梅雪香@深圳) 
    不知道怎么弄,能不能具体点说~
      

  6.   

    先在这里提供测试数据,方便我更好修改
    http://community.csdn.net/Expert/topic/4936/4936389.xml?temp=.9786341
      

  7.   

    楼主,你的代码我没有看,不过我想一个理想的 AutoComplete应该是这样工作的.
    思路:
    1.收集用户输入,如果用户不断的在输入文字(在打字),那么不执行ajax请求,只有
    用户停下来(空闲的时候)才进行ajax请求.
         误区:  <input type=text onchange="funcAjaxAndShowList(this.value)">
    这种基于onchange就请求数据的话,不仅会拖累服务器,而且对客户端的资源占用也很严重2.如果输入框的文字太短,比如用户只输入了一个或者两个字母,那就不要进行ajax请求.
    我的建议是最起码要3个字符或以上才执行ajax请求.这样返回的结果不会太多,而且可能正是
    用户需要的.3.每次返回的数据都要cache,因为用户如果继续输入字符的话,一般情况下返回的结果是cache里面的一个子集合.这时候就不需要ajax请求了,直接在客户端cache里面取.4.建议用json进行传输,这样的话,返回的结果可以直接cache不需要额外代码给你写端伪码吧
        <input type=text onkeyup="javascript:funcAutoComplete(this.value)">
      
    var timeoutId=null
    var idleTime=600;    //如果用户空闲时间超过600豪秒,则发送ajax请求
    var xmlhttp=null;
    var cache={keyword:"",result:[]};  //这个用来保存最近一次返回结果的数据
    function funcAutoComplete(input){
       if (timeoutId!=null){   //如果用户还在打字,继续收集用户输入  
          clearTimeOut(timeoutId)
          timeoutId=null
       }
        //如果cache里的keyword是input的一部分,那么就在cache里面取result数据
        if (eavl("/^"+cache.keyword+"/").test(input) && !cache.keyword.length){         
              var result=findInCache(cache)          //在cache的结果里面查询
              return  showSuggestList(result)          //显示 suggest 列表
        }
      
        if(!xmlhttp){
          xmlhttp=createXmlHttpObject() //建立xmlhttp,这个函数自己实现
        }else if(xmlhttp.readyState!=0){
          xmlhttp.abort();      //如果上一个请求还在发送中,先取消他
        }
        
       xmlhttp.open("get","url.asp?wd="+input,true) 
       
        xmlhttp.onreadystatechange=function(o){
            var result=json(o.responseText)  //用json处理数据
            showSuggestList(result)          //显示 suggest 列表
            cache=saveCache(result)          //更新cache
        }
        timeoutId=setTimeout(){function(){xmlhttp.send(null)},idleTime}
    }呵呵,没时间帮你写具体代码,但思路应该是这样,实现应该非常简单
      

  8.   

    其实网上有很多现成的autocomplete组件,下载一个研究一下就OK