js实现省,市,区,门店,电话,地址多级联动

3 篇文章 0 订阅

js实现省,市,区,门店,电话,地址多级联动

比较常见的是省市区三级联动,多级联动的写法第一次写,是在三级联动的基础上改的,如有错误欢迎指出。思路很简单,父级下拉框改变的时候加载出子级元素,一层一层往下。如果上级改变,清空所有子级的选项,只留提示选项。效果有点像后台通过查询数据库实现联动的效果。如果需要提交数据,也可以通过后台来实现。

初始状态图:
在这里插入图片描述
选择之后效果图:
居中的图片: 在这里插入图片描述

Html部分:select标签绑定onchange()事件,

// 数据联动部分
<div class="frmwrap">
	<form class="yaofrm">
		<select class="provinceselect" id="prov" onchange="showCity(this)">
			<option value="-1"></option>
		</select>
		<select class="cityselect" id="city" onchange="showCountry(this)">
			<option value="-1"></option>
		</select>
		<select class="areaselect" id="country" onchange="showShop(this)">
			<option value="-1">区域</option>
		</select>
		<select class="nameselect" id="shop" onchange="showNumAndAddr(this)">
			<option value="-1">请选择经销商</option>
		</select>
		<div class="numwrap hidden" id="numwrap">
			<label class="numtext">展厅电话</label>
			<input type="text" readonly="readonly" class="numinfo" id="numinfo" value="" />
		</div>
		<div class="addresswrap hidden" id="addresswrap">
			<label class="addresstext">详细地址</label>
			<input type="text" readonly="readonly" class="addrinfo" id="addrinfo" value="" />
		</div>
	</form>
</div>

method.js部分:

/*根据id获取对象*/
function $(str) {
	return document.getElementById(str);
}

var prov = $('prov');
var city = $('city');
var country = $('country');
var shop = $('shop');
var numinfo = $('numinfo');
var addrinfo = $('addrinfo');

/*用于保存当前所选的省市区*/
var current = {
	prov: '',
	city: '',
	country: '',
	shop: '',
	numinfo: '',
	addrinfo: ''
};
var phonenum = document.getElementById("numwrap");
var address = document.getElementById("addresswrap");

/*自动加载省份列表*/
(function showProv() {
	var len = provice.length;
	for(var i = 0; i < len; i++) {
		var provOpt = document.createElement('option');
		provOpt.innerText = provice[i]['name'];
		provOpt.value = i;
		prov.appendChild(provOpt);
	}
})();

/*根据所选的省份来显示城市列表*/
function showCity(obj) {
	//第二次选择时,初始化下级选项
	for(var i = 1; i < city.childNodes.length; i++) {
		city.remove(i);
		city.options[i] = null;
	}
	for(var i = 1; i < country.childNodes.length; i++) {
		country.remove(i);
		country.options[i] = null;
	}
	for(var i = 1; i < shop.childNodes.length; i++) {
		shop.remove(i);
		shop.options[i] = null;
	}
	phonenum.classList.add('hidden');
	address.classList.add('hidden');
	var val = obj.options[obj.selectedIndex].value;
	if(val != current.prov) {
		current.prov = val;
	}
	if(val != null) {
		city.length = 1;
		var cityLen = provice[val]["city"].length;
		for(var j = 0; j < cityLen; j++) {
			var cityOpt = document.createElement('option');
			cityOpt.innerText = provice[val]["city"][j].name;
			cityOpt.value = j;
			city.appendChild(cityOpt);
		}
	}

}

/*根据所选的城市来显示区县列表*/
function showCountry(obj) {
	for(var i = 1; i < country.childNodes.length; i++) {
		country.remove(i);
		country.options[i] = null;
	}
	for(var i = 1; i < shop.childNodes.length; i++) {
		shop.remove(i);
		shop.options[i] = null;
	}
	phonenum.classList.add('hidden');
	address.classList.add('hidden');
	var val = obj.options[obj.selectedIndex].value;
	if(val != current.city) {
		current.city = val;
	}
	if(val != null) {
		country.length = 1;
		var countryLen = provice[current.prov]["city"][val].districtAndCounty.length;
		for(var q = 0; q < countryLen; q++) {
			var countryOpt = document.createElement('option');
			countryOpt.innerText = provice[current.prov]["city"][val].districtAndCounty[q].name;
			countryOpt.value = q;
			country.appendChild(countryOpt);
		}
	}
}
/*根据所选的区县来显示门店列表*/
function showShop(obj) {
	for(var i = 1; i < shop.childNodes.length; i++) {
		shop.remove(i);
		shop.options[i] = null;
	}
	phonenum.classList.add('hidden');
	address.classList.add('hidden');
	current.country = obj.options[obj.selectedIndex].value;
	if((current.city != null) && (current.country != null)) {}

	var val = obj.options[obj.selectedIndex].value;
	if(val != current.shop) {
		current.shop = val;
	}
	if(val != null) {
		shop.length = 1; //清空之前的内容只留第一个默认选项
		var citylength = provice[current.prov]["city"].length;
		var shopLen = provice[current.prov]["city"][citylength - 1]["districtAndCounty"][val].mendian.length;

		if(shopLen == 0) {
			return;
		}
		for(var m = 0; m < shopLen; m++) {
			var shopOpt = document.createElement('option');
			//console.log(shopOpt)
			shopOpt.innerText = provice[current.prov]["city"][citylength - 1]["districtAndCounty"][val].mendian[m].name;
			shopOpt.value = m;
			shop.appendChild(shopOpt);
		}
	}
}

function showNumAndAddr(obj) {
    phonenum.classList.add('hidden');
	address.classList.add('hidden');
	var val = obj.options[obj.selectedIndex].value;
	if(val != current.numinfo || val != current.addrinfo) {
		current.numinfo = val;
		current.addrinfo = val;
	}
	if(val != null) {
		numinfo.length = 1;
		addrinfo.length = 1;
		var citylength = provice[current.prov]["city"].length;
		var numinfoOpt = provice[current.prov]["city"][citylength - 1]["districtAndCounty"][current.shop]["mendian"][val].NumAndAddr[0];
		var addrinfoOpt = provice[current.prov]["city"][citylength - 1]["districtAndCounty"][current.shop]["mendian"][val].NumAndAddr[1];
		if(numinfoOpt != null) {
			document.getElementById('numinfo').value = numinfoOpt;
			document.getElementById('addrinfo').value = addrinfoOpt;
			//显示电话,地址
			phonenum.classList.remove('hidden');
			address.classList.remove('hidden');
		}
	}

}
...

addr.js部分:只是实例,具体添加

// 地址文件 
var provice = [{
		name: "北京市",
		city: [{
			name: "北京市",
			districtAndCounty: [{
				name: "东城区",
				mendian: [{
					name: "门店1",
					NumAndAddr: ["021-00000000", "东城区东城路000号"]
				},
				{
					name: "门店2",
					NumAndAddr: ["021-11111111", "东城区东城路111号"]
				},
				{
					name: "门店3",
					NumAndAddr: ["021-11111111", "东城区东城路111号"]
				},
				{
					name: "门店4",
					NumAndAddr: ["021-11111111", "东城区东城路111号"]
				}]
			}, {
				name: "西城区",
				mendian: [{
						name: "门店5",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店6",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}]
			}]
		}
		]
	}, {
		name: "天津市",
		city: [{
			name: "天津市",
			districtAndCounty: [{
				name: "和平区",
				mendian: [{
						name: "门店5",
						NumAndAddr: ["021-00000000", "东城区东城路000号"]
					},
					{
						name: "门店6",
						NumAndAddr: ["021-11111111", "东城区东城路111号"]
					}
				]
			}, {
				name: "河东区",
				mendian: [{
						name: "门店7",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店8",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}
				]
			}]
		}, {
			name: "张家口市",
			districtAndCounty: [{
				name: "康保县",
				mendian: [{
						name: "门店5",
						NumAndAddr: ["021-00000000", "东城区东城路000号"]
					},
					{
						name: "门店6",
						NumAndAddr: ["021-11111111", "东城区东城路111号"]
					}
				]
			}, {
				name: "阿斯顿",
				mendian: [{
						name: "门店7",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店8",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}
				]
			}]
		}]
	}, {
		name: "河北省",
		city: [{
			name: "石家庄市",
			districtAndCounty: [{
				name: "长安区",
				mendian: [{
						name: "门店5",
						NumAndAddr: ["021-00000000", "东城区东城路000号"]
					},
					{
						name: "门店6",
						NumAndAddr: ["021-11111111", "东城区东城路111号"]
					}
				]
			}, {
				name: "桥东区",
				mendian: [{
						name: "门店7",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店8",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}
				]
			}]
		}, {
			name: "张家口市",
			districtAndCounty: [{
				name: "康保县",
				mendian: [{
						name: "门店5",
						NumAndAddr: ["021-00000000", "东城区东城路000号"]
					},
					{
						name: "门店6",
						NumAndAddr: ["021-11111111", "东城区东城路111号"]
					}
				]
			}, {
				name: "阿斯顿",
				mendian: [{
						name: "门店7",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店8",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}
				]
			}, {
				name: "asd",
				mendian: [{
						name: "门店7",
						NumAndAddr: ["021-33333333", "西城区西城路000号"]
					},
					{
						name: "门店8",
						NumAndAddr: ["021-44444444", "西城区西城路111号"]
					}
				]
			}]
		}]
	}
];

css部分忽略。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值