通过JAVASCRIPT及DOM实现对国家省份及城市级联查询的方法

前段时间做一个项目,需要动态的从后台数据里面里面提取相应国家、省份及城市的信息,实现的过程就是通过下拉菜单先选择一个国家,然后在另一个下拉框里面是这个国家的省份,再通过选择的省份填充另外一个城市的下拉框,其实通过级联查询的方式完全可以实现,或者一次性通过数组读取国家省份及城市的信息,然后填充这几个下拉框,觉得这样也不方便,想来想去何不用DOM的方式来实现了,思路如下:

第一,通过后台程序生成一个XML文件,节点分别为:国家——》省——》城市

第二,通过前台的的DOM提取这个XML文件

第三,通过脚本加载这个XML文件到相应的下拉框,首先加载国家,当选择某个国家的时候通过XML的查询语句再填充相应的省,依次类推,填充省下的城市,实现级联查询,省去了不少麻烦:)

生成XML文件的方式在这里就不提了,只把相应读XML文件的脚本贴出来,便于自己记忆:)

<html>
  <head>
    <title>city.htm</title>
   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; GBK">
    <script language="javascript">
    var xmlDoc;
    function init(initProvince, initCity) {//参数1:初始化时的省;参数2:初始化时的城市
     var sltOne = document.getElementById("classId");
     xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async = false;
  xmlDoc.load("cityXml.jsp");
  if (xmlDoc.parseError.errorCode != 0) {
     var myErr = xmlDoc.parseError;
     alert("You have error " + myErr.reason);
  } else {
     //alert(xmlDoc.xml);
     var oNodeList;
     var sonNode;
     var oNode;
     objNodeList = xmlDoc.getElementsByTagName("province");
   for (var i=0; i<objNodeList.length; i++) {
    oNode = objNodeList.item(i)
    var opt = document.createElement("OPTION");
    sltOne.add(opt);
    opt.innerText = oNode.getAttribute("name");
    opt.value = oNode.getAttribute("id");
    if(opt.innerValue == initProvince)
     opt.selected = true;
   }
   if(initCity.length > 0 && initProvince.length > 0)
    getCityByProvince(initProvince, initCity);
  }
 }
 
 function getCityByProvince(initProvince, initCity) {
  var sltTwo = document.getElementById("NclassIdt");
  sltTwo.length = 0;
  var curNode;//当前节点
  var cNode;//节点
  var xpath;//路径
  var name;//区域名称
  name = initProvince;//event.srcElement.value;
  xpath = "/catalog/province[@name='" + name + "']/city"
  //alert(xpath);
  cNode = xmlDoc.selectNodes(xpath);
  //alert(cNode.length);
  if(cNode.length == 0) {
   var opt = document.createElement("OPTION");
   sltTwo.add(opt);
   opt.value = "null";
   opt.innerText = "选择城市";
  }
  for(var i=0;i<cNode.length;i++) {
   curNode = cNode.item(i);
   var opt = document.createElement("OPTION");
   sltTwo.add(opt);
   opt.value = curNode.getAttribute("name");
   opt.innerText = curNode.getAttribute("name");
   if(opt.value == initCity)
    opt.selected = true;
  }
  
 }
</script>
   
  </head>
 
  <body οnlοad="init('','')">
    This is my HTML page. <br>
    <select id=sltOne οnchange="getVenuesByLocation(this.value)">
     <option value="null">选择省
    </select>
    <select id=sltTwo>
     <option value="null">选择城市
    </select>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
版本:v1.2 ----------------------------------------------- (C) Oran Day(likecode#gmail.com) ----------------------------------------------- ----------------------------------------------- 文件夹说明: - ChinaRegions_Complained 已编译后的dll - ChinaRegions_Source - 服务器控件源码项目 - html - 演示代码级源测试代码 ----------------------------------------------- ----------------------------------------------- ChinaRegion 文件名:OranChinaRegion.dll 自我说明XML:OranChinaRegion.XML 描述: 中国行政区域二级联系菜单,根据上级行政区加载下级行政区列表 XML数据驱动,可自定义添加、删除,简易更新 支持回发恢复状态,已正确设定行政区可自动选定和加载各级行政区数据 其它说明: 应用网站必须存在行政区域的数据XML文件,默认放于应用页面同级目录的oran/regions下,其中regions.xml为一级行政区数据,其它均为二级行政区数据 可自定义修改XML目录,在web.config/appSettings/ChinaRegionXmlFolderPath 配置,e.g.:/oran/regions 创建实例至少指定 runat 和 ID 属性。 应用: 1.为网站添加DLL引用 引用OranChinaRegion.dll 2.复制XML文件至网站 3.注册控件 e.g.: 4.在您期望的位置插入该控件, e.g.: 5.获取值 ParentRegion 获取或设置一级行政区 ChildRegion 获取或设置二级行政区 e.g: string parRgn = region1.ParentRegion; if (parRgn.Length > 0) Response.Write("您选择的是:" + parRgn); string chdRgn = region1.ChildRegion; if (chdRgn.Length > 0) Response.Write(" - " + chdRgn); 6.减少网络传输量,提高网络传输效率,您可以将XML压缩再应用于实际网站。 7.更多参数请参考自我说明XML。 8.期待您报告BUG:)。 -----------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值