Ajax 實現動態載入聯動列表框

來源:互聯網
上載者:User

 下面我示範兩個相關聯的列表框,一個是“省份”列表框,另外一個是省份的“城市”列表框,當單擊“省份”下拉框時,“城市”下拉框會隨之改變,將顯示所選擇省份內的城市。伺服器端在接收到頁面傳來的省份資料後,根據省份資料群組織相應的城市資料,並將城市資料以 XML 檔案的形式發送到用戶端。該XML 檔案格式很簡單,格式清單:

<?xml version="1.0" encoding="gb2312" ?>
<citys>
   <city>
     <id></id>
     <name></name>
   </city>
</citys>

      在這裡我為了精簡代碼,所以用一個雜湊表類比了伺服器端的資料庫。將事先定義好的 XML 資料直接以省份值為主鍵存入資料庫中,在從用戶端接收到省份值時,再查詢雜湊表取得對應的值。Java 中的雜湊表類似數學中的函數,比如:y = f(x) ,根據 x 就能確定 y 的值,在 map 裡就是 map.put("x","y"); map.get("x") == y。其實就是一一映射關係,key <------> value , 每個key對應一個value 知道了key也就知道了value 。另外還有一個JS的對象要向大家介紹:

一、Option 對象

var e = document.getElementById("selectId");

e.options = new Option("文本", "值");     //建立一個option對象,即在<select>標籤中建立一個或多個<option value="值">文本</option>。options是一個數組,裡面可存放多個<option value="值">文本</option>標籤。

◆options數組的屬性

length                                       長度

selectedIndex                           當前被選中文本的索引號,此索引值是記憶體自動分配的(0,1,2,3.......)對應(第一個標籤,第二個標籤,第三個標籤.......)

◆單個option的屬性

text                                            返回指定文本value                                         返回指定值index                                         返回下標selected                                    返回指定對象是否被選中,指定true反之false,可動態改變選中項

defaultSelected                         返回該對象預設是否被選中,選中true反之false

◆option的方法

增加一個<option>標籤               obj.options.add(new("文本", "值"))刪除一個<option>標籤               obj.options.remove(obj.selectedIndex);擷取一個<option>標籤               obj.options[obj.selectedIndex].text;修改一個<option>標籤               obj.options[obj.selectedIndex] = new Option("新文本", "值");刪除所有<option>標籤               obj.options.length = 0;

擷取一個<option>標籤的值        obj.options[obj.selectedIndex].value;

◆注意

obj.option中的option不需要大寫new Option中的option一定要大寫

本例共寫了 AjaxJS.js 指令碼、dropDownListServer.jsp 幕後處理、index.jsp 用戶端三個檔案。

AjaxJS.js 指令碼代碼:

//==========================================================全域變數區開始(XMLHttpRequest對象)
var xmlHttp;
//==========================================================全域變數區結束

/*================================================================================
Function:       建立XMLHttpRequest對象函數
Description:    根據瀏覽器建立XMLHttpRequest對象
Calls:          無
Called By:      selectChnge
Table Accessed: 無
Table Updated:   無
Table Deleted: 無
Input:          無
Output:         xmlHttp
Return:         無
Create:         2009-05-21/YJ/建立函數
Modify:         無
Others:         無
================================================================================*/
<!--
function createXMLHttpRequest()
{
if(window.ActiveXObject)
{
   xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
   if(window.XMLHttpRequest)
   {
    xmlHttp = new XMLHttpRequest();
   }
}
}
//-->

/*================================================================================
Function:       提交函數
Description:    根據選擇的省份向伺服器提交
Calls:          showcitys
Called By:      無
Table Accessed: 無
Table Updated:   無
Table Deleted: 無
Input:          控制項的ID
Output:         無
Return:         無
Create:         2009-05-21/YJ/建立函數
Modify:         無
Others:         無
================================================================================*/
function selectChnge(controlID)
{
var city = document.getElementById(controlID).value;

if(city != "null")
{
   createXMLHttpRequest();
   var url = "dropDownListServer.jsp?city="+city;
   xmlHttp.open("GET", url, true);
   xmlHttp.onreadystatechange = showcitys;
   xmlHttp.send(null);
}
}

/*================================================================================
Function:       返回城市列表函數
Description:    根據提交的省份返回城市列表
Calls:          無
Called By:      selectChnge
Table Accessed: 無
Table Updated:   無
Table Deleted: 無
Input:          無
Output:         無
Return:         無
Create:         2009-05-21/YJ/建立函數
Modify:         無
Others:         無
================================================================================*/
function showcitys()
{
if(xmlHttp.readyState == 4)
{
   if(xmlHttp.status == 200)
   {
    var cityData = xmlHttp.responseXML.getElementsByTagName("city");
    var citySelect = document.getElementById("city");
    citySelect.options.length = 0;

    for(var i = 0; i < cityData.length; i++)
    {
     var cityName = cityData[i].childNodes[0].firstChild.nodeValue;
     var cityID = cityData[i].childNodes[1].firstChild.nodeValue;
     var option = new Option(cityID, cityName);
    
     try
     {
      citySelect.add(option);
     }
     catch(e)
     {
      alert(e);
     }
    }
   }
   else
   {
    alert("您請求的頁面有異常!");
   }
}
}

dropDownListServer.jsp 幕後處理代碼:

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<%
String stDepart = request.getParameter("city");

if(stDepart == null)
{
   stDepart = "p1";
}

StringBuffer sb = new StringBuffer();
//解決中文亂碼問題
sb.append("<?xml version='1.0' encoding='gb2312'?>");
sb.append("<citys>");
//建立雜湊表類比伺服器端資料庫
Map map = new HashMap();
String p1 = "<city><id>10001</id><name>成都</name></city><city><id>10002</id><name>達州</name></city><city><id>10003</id><name>綿陽</name></city><city><id>10004</id><name>樂山</name></city><city><id>10005</id><name>遂寧</name></city><city><id>10006</id><name>攀枝花</name></city>";
String p2 = "<city><id>20001</id><name>鄭州</name></city><city><id>20002</id><name>洛陽</name></city><city><id>20003</id><name>開封</name></city><city><id>20004</id><name>安陽</name></city><city><id>20005</id><name>南陽</name></city>";
String p3 = "<city><id>30001</id><name>南京</name></city><city><id>30002</id><name>徐州</name></city><city><id>30003</id><name>蘇州</name></city><city><id>30004</id><name>常州</name></city><city><id>30005</id><name>揚州</name></city>";
String p4 = "<city><id>40001</id><name>長沙</name></city><city><id>40002</id><name>株洲</name></city><city><id>40003</id><name>嶽陽</name></city>";
String p5 = "<city><id>50001</id><name>荊州</name></city><city><id>50002</id><name>荊門</name></city><city><id>50003</id><name>黃石</name></city><city><id>50004</id><name>武漢</name></city>";
map.put("p1", p1);
map.put("p2", p2);
map.put("p3", p3);
map.put("p4", p4);
map.put("p5", p5);
//根據選擇的省份查詢對應的城市
sb.append((String)map.get(stDepart).toString());
sb.append("</citys>");
response.setContentType("text/xml");
out.write(sb.toString());
%>

index.jsp 用戶端代碼:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">
    <title>Ajax 動態載入列表框</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script language="javascript" type="text/javascript" src="./Resources/AjaxJS.js"></script>
</head>
<body>
<center>
   省份:
   <select id="province" onChange="selectChnge('province')">
    <option value="null">---------請選擇---------</option>
    <option value="p1">四川省</option>
    <option value="p2">海南省</option>
    <option value="p3">江蘇省</option>
    <option value="p4">湖南省</option>
    <option value="p5">湖北省</option>
   </select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   城市:
   <select id="city" style="width:150">
   </select>
</center>
</body>
</html>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.