《ajax基础教程》里一个自动补全的例子

这是一个类似于google自动补全的例子,挺长的,很容易打错,我调试了大半天才调出来,希望大家能用上。这个功能在表示层与用户交互的时候很有用,很人性化,很好的诠释了AJAX的异步的特点。

jsp部分如下:

<% @ page language="java" import="java.util.*" pageEncoding="gb2312" %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
  
< head >
    
< title > Ajax Auto Complete! </ title >
    
< style  type ="text/css" >
        .mouseOut
{
            background
: #708090;
            color
: #FFFAFA;    
        
}

        
        .mouseOver
{
            background
: #FFFAFA;
            color
: #000000;
        
}

    
</ style >
  
< script  type ="text/javascript" >
          
var xmlHttp;
          
var completeDiv;
          
var inputField;
          
var nameTable;
          
var nameTableBody;
          
          
function createXMLHttpRequest(){
              
if(window.ActiveXObject){
                  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>0){
                  createXMLHttpRequest();
                  
var url="/ajaxWeb/AutoCompleteServlet.do?names="+escape(inputField.value);
                  xmlHttp.open(
"GET",url,true);
                  xmlHttp.onreadystatechange
=callback;
                  xmlHttp.send(
null);

              }
else{
                  clearNames();
              }

              
          }

          
          
function callback(){
              
if(xmlHttp.readyState==4){
                  
if(xmlHttp.status==200){
                      
var name=xmlHttp.responseXML.getElementsByTagName("name")[0].firstChild.data;
                      
//alert(name);
                      setNames(xmlHttp.responseXML.getElementsByTagName("name"));
                  }
 else if (xmlHttp.status==204){
                  clearNames();
                  }

              }

          }

          
          
function setNames(the_names){          
              
//alert("1.the_names="+the_names.length);
              //alert("=1=");
              clearNames();
              
//alert("=2=");
              var size=the_names.length;
              
//alert("2.the_names="+size);
              //setOffsets()设置下拉框的属性
              setOffsets();
              
var row,cell,txtNode,tbody;
              
for(var i=0;i<size;i++){
                  
var nextNode=the_names[i].firstChild.data;
                  
                  
//tbody = document.createElement("tbody");                   
                  row=document.createElement("tr");
                  cell
=document.createElement("td");
                  txtNode
=document.createTextNode(nextNode);
                  
//cell的属性设置

                  
//===================================
                  cell.onmouseout=function(){this.className='mouseOver';}
                  cell.onmouseover
=function(){this.className='mouseOut';}              
                  cell.setAttribute(
"bgcolor","green");    
                  cell.setAttribute(
"border","0");                      
                cell.onclick
=function(){populateName(this);}                      
                  
//===================================        
                  //alert("=3=");    
                  nameTableBody.appendChild(row);          
                  row.appendChild(cell);            
                cell.appendChild(txtNode);
                
//alert("=4=");                        
                //===================================    
              }
              
          }

          
function setOffsets(){
              
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";
              nameTable.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;
              
//alert("1.下拉菜单个数="+ind);
              for(var i=ind-1;i>=0;i--){
                  nameTableBody.removeChild(nameTableBody.childNodes[i]);
              }

              ind
=nameTableBody.childNodes.length;
              
//alert("2.下拉菜单个数="+ind);
              completeDiv.style.border="none";
          }
          
          
  
</ script >
</ head >
  
< body >
          
< h1 > Ajax AutoComplete Example! </ h1 >
                Names : 
< input  type ="text"  id ="names"  size ="20"  onkeyup ="findNames();"  style ="height:20;"   />
                
< 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 >

这是两个类:AutoCompleteServlet和NameService

package  com.ajax;

import  java.io.IOException;
import  java.io.PrintWriter;
import  java.util. * ;

import  javax.servlet.ServletConfig;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

import  org.apache.struts.action.Action;
import  org.apache.struts.action.ActionForm;
import  org.apache.struts.action.ActionForward;
import  org.apache.struts.action.ActionMapping;

public   class  AutoCompleteServlet  extends  Action  {
    
private   List names=new ArrayList();
    
{
        names.add(
"abe");
        names.add(
"Abc");
        names.add(
"Abigail");
        names.add(
"Abnig");
        names.add(
"Ainni");
        names.add(
"Marry");
        names.add(
"Marcy");
        names.add(
"Marge");
        names.add(
"Marie");        
    }

/*    public void init() {
        System.out.println("===========>1.测试");
        names.add("abe");
        names.add("Abc");
        names.add("Abigail");
        names.add("Abnig");
        names.add("Ainni");
        names.add("Marry");
        names.add("Marcy");
        names.add("Marge");
        names.add("Marie");        
    }
*/

    
public ActionForward execute(ActionMapping mapping, ActionForm form,   
            HttpServletRequest request, HttpServletResponse response) 
throws IOException {  
        
//init();
        System.out.println("===========>3.测试");
        String prefix
=request.getParameter("names");
        NameService service
=NameService.getInstance(names);
        System.out.println(
"===========>5.测试");
        List matching
=service.findNames(prefix);
        
if(matching.size()>0){
            PrintWriter out
=response.getWriter();
            
            response.setContentType(
"text/xml");
            response.setHeader(
"Cache-Control""no-cache");
            
            out.println(
"<response>");
            Iterator iter
=matching.iterator();
            
while(iter.hasNext()){
                String name
=(String) iter.next();
                out.println(
"<name>"+name+"</name>");
            }

            out.println(
"</response>");
            matching
=null;
            service
=null;
            out.close();
        }
else{
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        }

        
return null;
    }

}

 

package  com.ajax;

import  java.util. * ;

public   class  NameService  {
    
private List names;
    
    
private NameService(List list_of_names){
        System.out.println(
"===========>4.测试");
        
this.names=list_of_names;
    }

    
    
public static NameService getInstance(List list_of_names){
        
return new NameService(list_of_names);        
    }

    
    
public List findNames(String prefix){
        String prefix_upper
=prefix.toUpperCase();
        List matches
=new ArrayList();
        Iterator iter
=names.iterator();
        
while(iter.hasNext()){
            String name
=(String) iter.next();
            String name_upper_case
=name.toUpperCase();
            
if(name_upper_case.startsWith(prefix_upper)){
                
boolean result=matches.add(name);
            }

        }

        
return matches;
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你看到本书时,可能已经了解在应用中实现当你看到本书时,可能已经了解在应用中实现 当你看到本书时,可能已经了解在应用中实现 当你看到本书时,可能已经了解在应用中实现当你看到本书时,可能已经了解在应用中实现 当你看到本书时,可能已经了解在应用中实现 当你看到本书时,可能已经了解在应用中实现当你看到本书时,可能已经了解在应用中实现当你看到本书时,可能已经了解在应用中实现 Ajax所需的大多数技术。重申一句,我 所需的大多数技术。重申一句,我 所需的大多数技术。重申一句,我所需的大多数技术。重申一句,我所需的大多数技术。重申一句,我所需的大多数技术。重申一句,我所需的大多数技术。重申一句,我所需的大多数技术。重申一句,我们想强调的是, 们想强调的是, 们想强调的是, Ajax一个客户端技术,不论你现在使用 何种服务器都能是一个客户端技术,不论你现在使用何种服务器都能是一个客户端技术,不论你现在使用 何种服务器都能是一个客户端技术,不论你现在使用 何种服务器都能是一个客户端技术,不论你现在使用 何种服务器都能是一个客户端技术,不论你现在使用 何种服务器都能是一个客户端技术,不论你现在使用 何种服务器都能Ajax,而不管使用的是 Java、.NET、Ruby、PHP还是 CGI。实际上,在这本书中我们并不 。实际上,在这本书中我们并不。实际上,在这本书中我们并不。实际上,在这本书中我们并不。实际上,在这本书中我们并不 考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面考虑服务器端,而且假设你已经很清楚如何结合日常工作中使用的 技术。在后面几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到几百页中,我们强调的重点是客户端技术和方法创建丰富基于浏览器应用时需要到 这些技术。这些技术。这
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值