APP下载

基于Ajax的多级联动研究

2020-02-22许俊

电脑知识与技术 2020年36期
关键词:联动

许俊

摘要:对行政地区信息使用Ajax与后台服务器进行xml数据交换,不重新加载整个网页,实现网页内的地区列表异步更新。地区信息为省市县三级结构的xml文件,根据节点的id查询其子节点的id和文本,并设置为下拉选择框的属性值,下拉选择框的change事件监听用户的选择,填充下一级选择框元素,达到多级动态联动。

关键词:Ajax;异步;JavaScript;联动

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2020)36-0236-02

1 Ajax的工作原理

Ajax即Asynchronous JavaScript And XML,异步JavaScript和XML,是指一种创建交互式、快速动态网页应用的网页开发技术,无须重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

使用JavaScript 向服务器提出请求并处理响应而不阻塞用户核心对象XMLHttpRequest。通过这个对象,JavaScript在不需要刷新页面的情况下,就可以产生局部刷新的效果。

Ajax独立于Web 服务器,在浏览器与Web 服务器之间使用异步数据传输HTTP 请求,网页从服务器请求少量的信息,而不是整个页面,应用程序更小更快更友好。

Ajax 应用程序独立于浏览器和平台,基于JavaScript、XML、HTML与 CSS 在 Ajax 中使用的 Web 标准定义,并被所有的主流浏览器支持。Ajax工作原理如下图。

2地区信息xml文件和页面的结构

地区信息为省市县三级结构的area.xml文件,行政单位涵盖了全国的省直辖市、市、区县辖区。设置四级节点,area是根节点,id是root,二级province节点是省直辖市,id是省(直辖市的拼音),value是省份行政代码。三级city节点是地级市,其id是拼音或缩写。四级county节点是县区,是三级行政单位的最低级,不再向下联动,故无须id,如果将来把行政地区要扩展到乡镇级,则需要设置county的id。地区xml文档结构如下图示意。

网页文件三个select标签作为省市县的容器,id分别为province、city、county。

3三级联动的设计思路

定义全局变量。页面加载完成之后,初始化页面元素,用省直辖市名称填充id为province的select对象。为province、city选择框添加change事件监听器。三个选择框的默认选项设为第一项。

初始化填充省份选择框的设计是,创建XMLHTTPRequest对象异步读取web服务器上的area.xml省份,根据id得到root节点的所有省份子节点的id和名称。并以省名称为选项的text,id为value,把省份的名称、id添加到省份选择框。

province选择框change事件发生时,得到被选中项的value,作为读取xml文件city节点的父节点id,根据此id得到city节点的所有城市子节点的id和名称。并以城市名称为选项的text,id为value,把城市的名称、id添加到城市选择框。

city选择框change事件发生时,得到被选中项的value,作为读取xml文件county节点的父节点id,根据此id得到county节点的所有县区子节点的id和名称。并以county名称为选项的text,id为value,把县区的名称、id添加到县区选择框。

4三级联动的Javascript实现

函数fillProvince、fillCity、fillCounty分别填充省、城市、县区选择框,getNodeValue查询子节点的id、文本节点值。

window.addEventListener("load", initAll, false);

var xhr = false;//异步对象

var url = "area.xml";

var nodeId="";//area.xml文件中的节点id值

var pageSelectElementId;//index.html页面中select下拉框ID:province、city、county

function initAll() {//初始化

fillProvince();

document.getElementById("province").addEventListener("change", fillCity, false);

document.getElementById("city").addEventListener("change", fillCounty, false);

document.getElementById("province").selectedIndex = 0;

document.getElementById("city").selectedIndex = 0;

document.getElementById("county").selectedIndex = 0;

}

//填充省份選择框

function fillProvince() {

nodeId = "root";//xml文件的根节点,所有省

pageSelectElementId = "province";//决定填充的是省份选择框

makeRequest(url);

}

//点击选择省框,填充城市选择框

function fillCity() {

var option = this.options[this.selectedIndex];

var province = option.value;

if (province != "") {

document.getElementById("city").options.length = 1;

document.getElementById("county").options.length = 1;

nodeId = option.value;

pageSelectElementId="city";

makeRequest(url);

}

}

//點击市选择框,填充县选择框

function fillCounty() {

var option = this.options[this.selectedIndex];

var city = option.value;

if (city != "") {

document.getElementById("county").options.length = 1;

nodeId = option.value;

pageSelectElementId ="county";

makeRequest(url);

}

}

//异步请求服务器文件

function makeRequest(url) {

//创建XMLHTTPRequest对象xhr

if (window.XMLHttpRequest) {

xhr = new XMLHttpRequest();

} else{

if(window.ActiveXObject){

try{

xhr = new ActiveXObject("Microsoft.XMLHTTP");

}catch(e){

document.getElementById("updateArea").innerHTML = e.message;

}

}

}

//创建向服务器的请求并发送

if (xhr){

xhr.addEventListener("readystatechange", getNodeValue, false);

xhr.open("GET", url, true); //true:默认值,异步,false:同步。

xhr.send(null);

} else {

document.getElementById("updateArea").innerHTML="不能创建XMLHTTPRequest";

}

}

//返回服务器响应的内容

//对响应的文件类型是xml,根据元素的ID,遍历元素的子节点,查询子节点的id、文本节点值。

function getNodeValue() {

var outMsg = "";

if (xhr.readyState == 4) {

if (xhr.status == 200) {

if (xhr.responseXML&&xhr.responseXML.childNodes.length> 0) {       //根据指定的ID,读其子节点

var id = nodeId;

var elements = xhr.responseXML.getElementById(id).children;

for (var i = 0; i

var chilId = elements[i].getAttribute("id"); //子节点的id

var nodeValue= elements[i].firstChild.nodeValue; //文本节点值各级名称

//设置下拉选择框选项文本和value属性

document.getElementById(pageSelectElementId).options.add(new Option(nodeValue,chilId));

}

} else {

var outMsg = "文件类型不是xml";

}

} else {

var outMsg = "报错代码: " + xhr.status;

}

document.getElementById("updateArea").innerHTML = outMsg;

}

}

参考文献:

[1] 童绪军,陈涛.基于AJAX UpdatePanel无刷新多级联查询的应用研究[J].信息与电脑(理论版),2019(22):62-63.

[2] 王志娟,班娅萌,平金珍.基于AJAX技术和JAVAEE的分页查询优化[J].信息通信,2019,32(1):118-119.

【通联编辑:光文玲】

猜你喜欢

联动
多展联动:“新常态”下会展业发展的新思路