日期:2014-05-16  浏览次数:20812 次

一个ajax自动完成的例子

?????? 在项目当中,经常会有输入省市名称的要求,如果采用下拉框的形式,用户选择会很不方便,因为选项太多。这种情况下可以采用AJAX自动完成功能。 见下图:

??????

?首先看页面的标签(部分):

          <td>航段起点</td>
              
          <td>  
              <html:hidden property="cityBegin" />     <!-- 这里存放的是实际存储的ID-->
              <html:text property="cityBeginText" onkeyup="search('cityBeginText','cityBegin','popup')"/> 
             <div style="autodiv" id="popup"><table><tbody></tbody></table></div> 			      
          </td>

?search函数具体实现:

function search(inputId,outputId,divId){
    init(inputId,outputId,divId);        //初始化相关页面元素    
    if ((inputField.value.length<=0)||(event.keyCode==13)){
        outputField.value="";
	    return false;
	}
	var tmp= inputField.value;
	
	var url='autocomplete.do';
	var pars ='action=city&city=' + tmp;
	var myAjax = new Ajax.Request(
        url,
        {
            method: 'get',
            parameters: pars,
            onComplete: this.showResponse                  //这里是回调函数。 
         }
     );
}

??在服务器端,返回的是xml格式的数据。形如:

?

<response>
    <item>
         <id>1</id><value>南京市</value>
    </item>
    <item>
         <id>2</id><value>南昌市</value>
    </item>
</response>

?

showResponse的任务有:解析返回的xml数据,计算div的位置,填充div。

?

function showResponse(originalRequest){
    clearDiv();            //先清空。
    outputField.value="";
    var values=originalRequest.responseXML.getElementsByTagName("value");
    var ids =originalRequest.responseXML.getElementsByTagName("id");
    var size = values.length;
    setOffsets();               //计算div的位置
    var row, cell, txtNode;
    for (var i = 0; i < size; i++) {                             //开始填充
        var nextNode = values[i].firstChild.data;
        var nextId = ids[i].firstChild.data;
        row = document.createElement("tr");
        cell = document.createElement("td");
        cell.onmouseout = function() {this.className='mouseOver';};
        cell.onmouseover = function() {this.className='mouseOut';};
        cell.setAttribute("bgcolor", "#FFFAFA");
        cell.setAttribute("border", "0");
        var input = document.createElement("input");
        input.setAttribute("type","hidden");
        input.setAttribute("name","id");
        input.setAttribute("value",nextId);
        cell.onclick = function() { populateName(this); } ;    //注意这个函数populateName
        txtNode = document.createTextNode(nextNode);
        cell.appendChild(txtNode);
        cell.appendChild(input);
        row.appendChild(cell);
        tbody.appendChild(row);
  
    }	
     
    completeDiv.appendChild(table);
}

?

populateName函数的作用是什么呢?当鼠标在下拉的div上选择了某一行(地区)的时候,该地区在数据库端的id被存储到隐藏的input当中,这里是“cityBegin”,该函数的代码:

function populateName(cell){
    inputField.value = cell.firstChild.nodeValue;    //value被赋给了“cityBeginText”
    outputField.value=cell.lastChild.value;            //id被赋给了“cityBegin” 
    clearDiv();                                                                
     
}

?当该页面被提交后,服务器端先检查“cityBegin”的值空否,如果不空,则不需要再根据“cityBeginText”的值查询数据库,避免了地区id的重复查询。? 当然,前提条件是地区信息是用户从下拉div当中选择的。

1 楼 yourgame 2008-06-14  
好东西,值得借鉴
2 楼 zhangxi123 2008-06-14  
下了看看!谢谢
3 楼 guowei821120 2008-07-25  
美女 支持
4