浏览 12696 次
锁定老帖子 主题:一个ajax自动完成的例子
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-12
最后修改:2010-03-01
在项目当中,经常会有输入省市名称的要求,如果采用下拉框的形式,用户选择会很不方便,因为选项太多。这种情况下可以采用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当中选择的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-25
貌似lz做的和我现在做的东西比较像, 给机票代理人或者航空公司做的吧? 能否留个联系方式交流交流.
|
|
返回顶楼 | |
发表时间:2008-07-25
赞一个
------- PS: JSF框架ICEFACES,richfaces之类的 或是YUI等JS库 都有类似的例子 |
|
返回顶楼 | |
发表时间:2008-12-24
不错.现在大多是用Jquery插件实现.
|
|
返回顶楼 | |
发表时间:2008-12-24
最后修改:2008-12-24
不错!
看看我的怎么样? http://zhudp-cn.iteye.com/admin/blogs/254445 ![]() |
|
返回顶楼 | |
发表时间:2009-01-09
整合到了自己的框架里面,挺好的,
if ((inputField.value.length<=0)||(event.keyCode==13)){ outputField.value=""; return false; } 这里是不是要clearDiv();要不然把输入框(cityBeginText)的内容全部删除后,completeDiv还在显示; |
|
返回顶楼 | |