js+xml实现省市县三级联动

支持默认值设置哦

/**
*
* @author Darkness
* Email: darkness_sky@qq.com
* QQ: 893951837
*/
var Darkness = new Object();

Darkness.ProvinceCityCountry = function(){
}

Darkness.ProvinceCityCountry.prototype = {
strDefaultProvince: '江苏省',
strDefaultCity: '南京市',
strDefaultCountry: '白下区',
xmlDoc: null,
ddlProvince: null,
ddlCity: null,
ddlCountry: null,

/** 构造器,不知道在new的时候为什么不执行,郁闷...*/
constructor: function(config) {
//首先需要初始化
this.getXmlDoc("Area.xml");

var strProvinceId = config.ddlProvinceId || "provinceId";
var strCityId = config.ddlCityId || "cityId";
var strCountryId = config.ddlCountryId || "countryId";

this.ddlProvince = document.getElementById(strProvinceId);
this.ddlCity = document.getElementById(strCityId);
this.ddlCountry = document.getElementById(strCountryId);

// 该绑定事件失败
// this.bindOnChangeEvent(this);

this.strDefaultProvince = config.province || this.strDefaultProvince;
this.strDefaultCity = config.city || this.strDefaultCity;
this.strDefaultCountry = config.country || this.strDefaultCountry;
},

/** 本想在这儿绑定onchange事件(就省掉在控件中加上
onchange="objProvinceCityCountry.onSelectCity();"了)的,
因为实际调用的时候this指向激活该事件的控件,
而非Darkness.ProvinceCityCountry的实例,所以该绑定总是失败
(onSelectCity方法中的this总是指向激活该事件的控件),不知道
有没有什么好的解决办法...
bindOnChangeEvent: function(_instence){
// onchange="objProvinceCityCountry.onSelectCity();"
// onchange="objProvinceCityCountry.onSelectCountry();"
this.ddlProvince.onchange = _instence.onSelectCity;
this.ddlProvince.onchange = _instence.onSelectCountry;
},*/

/** 初始化方法,还得手动调用constructor。记得在new的时候constructor应该
是自动执行的,不知道在这儿怎么不行了*/
init: function (config){
this.constructor(config);

var m_TopnodeList= this.getNodeByXPath('address').childNodes;

//省份列表
this.setSelectOptions(this.ddlProvince,m_TopnodeList);
this.selectCity(this.strDefaultProvince);
this.selectCountry(this.strDefaultCity);
},


/** 打开xlmdocm文档 */
getXmlDoc: function (xmlFilePath){
this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
this.xmlDoc.async = false;
this.xmlDoc.load(xmlFilePath);
if(this.xmlDoc.parseError.errorCode!=0){
var myErr = this.xmlDoc.parseError;
alert("解析xml出错!" + myErr.reason);
}
},

/** 根据XPath获取一个Node */
getNodeByXPath: function (strXPath) {
return this.xmlDoc.selectSingleNode(strXPath);
},

/** 设置childNodes到一个select对象中 */
setSelectOptions: function(objSelect,childNodes) {
var m_ChildNodes = childNodes;

this.removeDropDownList(objSelect);

for(var i = 0; i < m_ChildNodes.length; i++){
var childNode = m_ChildNodes[i];
var eOption = document.createElement("option");
eOption.value = childNode.getAttribute("name");
eOption.text = childNode.getAttribute("name");
objSelect.add(eOption);

if( (eOption.value == this.strDefaultProvince)
|| (eOption.value == this.strDefaultCity)
|| (eOption.value == this.strDefaultCountry)){
eOption.selected = 'selected';
}
}
},

/** 选择城市事件 */
onSelectCity: function () {
this.selectCity(this.ddlProvince.options[this.ddlProvince.selectedIndex].value);
},

/** 选择县区事件 */
onSelectCountry: function () {
this.selectCountry(this.ddlCity.options[this.ddlCity.selectedIndex].value);
},

/** 根据省查询城市 */
selectCity: function (provinceName){
var provinceNode = this.getNodeByXPath('//address/province [@name="' + provinceName + '"]');

if(provinceNode.childNodes.length > 0){
//填充城市
this.setSelectOptions(this.ddlCity,provinceNode.childNodes);

if(provinceNode.childNodes[0].childNodes.length>0){
//填充选择省份的第一个城市的县列表
this.setSelectOptions(this.ddlCountry,provinceNode.childNodes[0].childNodes);
}
}
},

/** 根据城市查询县区 */
selectCountry: function (cityName){
var cityNode = this.getNodeByXPath('//address/province/city[@name="'+cityName+'"]');

this.setSelectOptions(this.ddlCountry,cityNode.childNodes);
},

/** 移除select下的所有options */
removeDropDownList: function (obj){
if(obj){
var len = obj.options.length;
if(len>0){
for(var i=len;i>=0;i--){
obj.remove(i);
}
}
}
}
}


使用:

<html>
<head runat="server">
<title>js + xml 省市县三级联动</title>
<script language="javascript" type="text/javascript" src="Area.js">
</script>
<script language="javascript" type="text/javascript">
var objProvinceCityCountry = null;
function OnInit(){
objProvinceCityCountry = new Darkness.ProvinceCityCountry();
// 初始化方法,必须传入省市县ddl控件的id,
// 否则默认为provinceId、cityId、countryId
// province默认值:江苏省,city默认值:南京市,country默认值:白下区
objProvinceCityCountry.init({
ddlProvinceId: 'strProvinceId1',
ddlCityId: 'strCityId1',
ddlCountryId: 'strCountryId1',
province: document.getElementById('defaultProvince1').value,
city: document.getElementById('defaultCity1').value,
country: document.getElementById('defaultCountry1').value
});
}
</script>
</head>
<body onload="OnInit();">
<form id="form1" runat="server">
<div>
<select id="strProvinceId1" name="province" runat="server" onchange="objProvinceCityCountry.onSelectCity();">
<option value="" selected="selected">省/直辖市</option>
</select>
<select id="strCityId1" name="city" runat="server" onchange="objProvinceCityCountry.onSelectCountry();">
<option value="" selected="selected">请选择</option>
</select>
<select id="strCountryId1" name="country" runat="server" >
<option value="" selected="selected">请选择</option>
</select>
</div>

<input type="text" id="defaultProvince1" value=""/>
<input type="text" id="defaultCity1" value=""/>
<input type="text" id="defaultCountry1" value=""/>

<input type="button" value="设置默认值" onclick="javascript:OnInit();"/>

</form>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
省市联动XML <?xml version="1.0" encoding="utf-8"?> <china> <province name="北京"> <city>东城区</city> <city>西城区</city> <city>崇文区</city> <city>宣武区</city> <city>朝阳区</city> <city>丰台区</city> <city>石景山区</city> <city>海淀区</city> <city>门头沟区</city> <city>房山区</city> <city>通州区</city> <city>顺义区</city> <city>昌平区</city> <city>大兴区</city> <city>怀柔区</city> <city>平谷区</city> <city>密云</city> <city>延庆</city> </province> <province name="天津"> <city>和平区</city> <city>河东区</city> <city>河西区</city> <city>南开区</city> <city>河北区</city> <city>红桥区</city> <city>塘沽区</city> <city>汉沽区</city> <city>大港区</city> <city>东丽区</city> <city>西青区</city> <city>津南区</city> <city>北辰区</city> <city>武清区</city> <city>宝坻区</city> <city>宁河</city> <city>静海</city> <city>蓟</city> </province> <province name="河北"> <city>石家庄</city> <city>唐山</city> <city>秦皇岛</city> <city>邯郸</city> <city>邢台</city> <city>保定</city> <city>张家口</city> <city>承德</city> <city>沧州</city> <city>廊坊</city> <city>衡水</city> </province> <province name="山西"> <city>太原</city> <city>大同</city> <city>阳泉</city> <city>长治</city> <city>晋城</city> <city>朔州</city> <city>晋中</city> <city>运城</city> <city>忻州</city> <city>临汾</city> <city>吕梁</city> </province> <province name="内蒙古"> <city>呼和浩特</city> <city>包头</city> <city>乌海</city> <city>赤峰</city> <city>通辽</city> <city>鄂尔多斯</city> <city>呼伦贝尔</city> <city>巴彦淖尔</city> <city>乌兰察布</city> <city>兴安盟</city> <city>锡林郭勒盟</city> <city>阿拉善盟</city> </province> <province name="辽宁"> <city>沈阳</city> <city>大连</city> <city>鞍山</city> <city>抚顺</city> <city>本溪</city> <city>丹东</city> <city>锦州</city> <city>营口</city> <city>阜新</city> <city>辽阳</city> <city>盘锦</city> <city>铁岭</city> <city>朝阳</city> <city>葫芦岛</city> </province> <province name="吉林"> <city>长春</city> <city>吉林</city> <city>四平</city> <city>辽源</city> <city>通化</city> <city>白山</city> <city>松原</city> <city>白城</city> <city>延边</city> </province> <province name="黑龙江"> <city>哈尔滨</city> <city>齐齐哈尔</city> <city>鸡西</city> <city>鹤岗</city> <city>双鸭山</city> <city>大庆</city> <city>伊春</city> <city>佳木斯</city> <city>七台河</city> <city>牡丹江</city> <city>黑河</city> <city>绥化</city> <city>大兴安岭</city> </province> <province name="上海"> <city>黄浦区</city> <city>卢湾区</city> <city>徐汇区</city> <city>长宁区</city> <city>静安区</city> <city>普陀区</city> <city>闸北区</city> <city>虹口区</city> <city>杨浦区</city> <city>闵行区</city> <city>宝山区</city> <city>嘉定区</city> <city>浦东新区</city> <city>金山区</city> <city>松江区</city> <city>青浦区</city> <city>南汇区</city> <city>奉贤区</city> <city>崇明</city> </province> <province name="江苏"> <city>南京</city> <city>无锡</city> <city>徐州</city> <city>常州</city> <city>苏州</city> <city>南通</city> <city>连云港</city> <city>淮安</city> <city>盐城</city> <city>扬州</city> <city>镇江</city> <city>泰州</city> <city>宿迁</city> </province> <province name="浙江"> <city>杭州</city> <city>宁波</city> <city>温州</city> <city>嘉兴</city> <city>湖州</city> <city>绍兴</city> <city>金华</city> <city>衢州</city> <city>舟山</city> <city>台州</city> <city>丽水</city> </province> <province name="安徽"> <city>合肥</city> <city>芜湖</city> <city>蚌埠</city> <city>淮南</city> <city>马鞍山</city> <city>淮北</city> <city>铜陵</city> <city>安庆</city> <city>黄山</city> <city>滁州</city> <city>阜阳</city> <city>宿州</city> <city>巢湖</city> <city>六安</city> <city>亳州</city> <city>池州</city> <city>宣城</city> </province> <province name="福建"> <city>福州</city> <city>厦门</city> <city>莆田</city> <city>三明</city> <city>泉州</city> <city>漳州</city> <city>南平</city> <city>龙岩</city> <city>宁德</city> </province> <province name="江西"> <city>南昌</city> <city>景德镇</city> <city>萍乡</city> <city>九江</city> <city>新余</city> <city>鹰潭</city> <city>赣州</city> <city>吉安</city> <city>宜春</city> <city>抚州</city> <city>上饶</city> </province> <province name="山东"> <city>济南</city> <city>青岛</city> <city>淄博</city> <city>枣庄</city> <city>东营</city> <city>烟台</city> <city>潍坊</city> <city>济宁</city> <city>泰安</city> <city>威海</city> <city>日照</city> <city>莱芜</city> <city>临沂</city> <city>德州</city> <city>聊城</city> <city>滨州</city> <city>荷泽</city> </province> <province name="河南"> <city>郑州</city> <city>开封</city> <city>洛阳</city> <city>平顶山</city> <city>安阳</city> <city>鹤壁</city> <city>新乡</city> <city>焦作</city> <city>濮阳</city> <city>许昌</city> <city>漯河</city> <city>三门峡</city> <city>南阳</city> <city>商丘</city> <city>信阳</city> <city>周口</city> <city>驻马店</city> </province> <province name="湖北"> <city>武汉</city> <city>黄石</city> <city>十堰</city> <city>宜昌</city> <city>襄樊</city> <city>鄂州</city> <city>荆门</city> <city>孝感</city> <city>荆州</city> <city>黄冈</city> <city>咸宁</city> <city>随州</city> <city>恩施</city> <city>神农架</city> </province> <province name="湖南"> <city>长沙</city> <

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值