html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Auto Complete</title>
</head>
<style type="text/css">
.mouseOut{
background:#FFFFFF;
color:#000000;
}
.mouseOver{
background:#0066FF;
color: #000000;
}
</style>
<script type="text/javascript" language="javascript">
var xmlHttp;
//创建XMLHttp对象实例
function createXMLHttpRequest() {
if (window.ActiveXObject) {//如果是IE
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function initVars(){
inputField=document.getElementById("names");
nameTable=document.getElementById("name_table");
completeDiv=document.getElementById("popup");
nameTableBody=document.getElementById("name_table_body");
}
function findNames(){
initVars();
if(inputField.value.length>=3){
createXMLHttpRequest();
var url="autocomplete.do?name="+escape(inputField.value);
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=callback;
xmlHttp.send(null);
}else{
clearNames();
}
}
function callback(){
if(xmlHttp.readyState==4){//判断请求的状态(0=未初始化,1=正在加载,2=已经加载,3=交互,4=完成)
if(xmlHttp.status==200){//判断Server的Http状态码(200对应 ok , 404对应Not Found,204对应返回空)
var name=xmlHttp.responseXML.getElementsByTagName("name")[0].firstChild.data;
setNames(xmlHttp.responseXML.getElementsByTagName("name"));
}else if(xmlHttp.status==204){
clearNames();
}
}
}
function setNames(the_names){
clearNames();
var size=the_names.length;
setOffset();
var row,cell,textNode;
for(var i=0;i<size;i++){
var textNode=the_names[i].firstChild.data;
row=document.createElement("tr");
cell=document.createElement("td");
cell.οnmοuseοut=function(){this.className="mouseOut";};
cell.οnmοuseοver=function(){this.className="mouseOver";};
cell.setAttribute("bgcolor","#FFFAFA");
cell.setAttribute("border","0");
cell.οnclick=function(){populateName(this);};
textNode=document.createTextNode(textNode);
cell.appendChild(textNode);
row.appendChild(cell);
nameTableBody.appendChild(row);
}
}
function setOffset(){
var end=inputField.offsetWidth;
var left=calculateOffsetLeft(inputField);
var top=calculateOffsetTop(inputField)+inputField.offsetHeight;
completeDiv.style.border="black 1px solid";
completeDiv.style.left=left+"px";
completeDiv.style.top=top+"px";
completeDiv.style.width=end+"px";
}
function calculateOffsetLeft(field){
return calculateOffset(field,"offsetLeft");
}
function calculateOffsetTop(field){
return calculateOffset(field,"offsetTop");
}
function calculateOffset(field,attr){
var offset=0;
while(field){
offset+=field[attr];
field=field.offsetParent;
}
return offset;
}
function populateName(cell){
inputField.value=cell.firstChild.nodeValue;
clearNames();
}
function clearNames(){
var ind=nameTableBody.childNodes.length;
if(ind>0){
for(var i=ind-1;i>=0;i--){
nameTableBody.removeChild(nameTableBody.childNodes[i]);
}
completeDiv.style.border="none";
}
}
</script>
<body>
Names:
<input type="text" size="20" id="names" οnkeyup="javascript:findNames()" />
<div style="position:absolute;" id="popup">
<table id="name_table" bgcolor="#FFFAFA" border="0" cellspacing="0" cellpadding="0">
<tbody id="name_table_body"></tbody>
</table>
</div>
</body>
</html>
server action:
package cxm.ajax;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import java.io.PrintWriter;
import java.util.ArrayList;
public class autoComplete extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String prefix=request.getParameter("name");
ArrayList<String> findlist=findnamefun(prefix);
if(findlist.size()>0){
PrintWriter pout = response.getWriter();
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
pout.println("<response>");
for(String name: findlist){
pout.println("<name>"+name+"</name>");
}
pout.println("</response>");
pout.flush();
pout.close();
}else{
response.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
return null;
}
public static ArrayList<String> findnamefun(String par){
ArrayList<String> haslist=new ArrayList<String>();
ArrayList<String> returnlist=new ArrayList<String>();
haslist.add("cxmcyq");
haslist.add("cxmcyqall");
haslist.add("cxmcyqplay");
haslist.add("cxmcyqlove");
haslist.add("cxm");
haslist.add("cxmcy");
haslist.add("cxmcyq");
haslist.add("cyq");
haslist.add("cyqicxm");
for (int i = 0; i < haslist.size(); i++) {
if(haslist.get(i).toString().toLowerCase().startsWith(par.toLowerCase())){
returnlist.add(haslist.get(i).toString());
}
}
return returnlist;
}
}