【实践】用for-in 循环实现三联联动
之前用jq 做过一次三联联动以及四联联动
现在为了更好地了解对象用js的原生方式做了一次
*本节要点方法:
obj.selectedIndex 获取下拉列表选中的option 的索引
obj.options[obj.selectedIndex].text 获取对应下标option的文本值
obj.onchange =function(){} 下拉列表选中option更改事件
知道这些方法之后我们就可以开始动手了
下面是html代码
<select id="provin">
<option>请选择省</option>
</select>
<select id="city">
<option>请选择市</option>
</select>
<select id="area">
<option>请选择区/县</option>
</select>
js代码:
注释应该能够很好地说明了
<script type="text/javascript">
window.onload = function(){
//建一个 data对象此对象里面有三个省名的属性
//各个省名的属性又有几个对应市名的属性
//各个市名属性的值包含着对应的区/县名
var data = {
广东省:{
广州市:"荔湾区,越秀区,海珠区,天河区,芳村区,白云区,黄埔区,番禺市,花都市,增城市,从化市",
深圳市:"罗湖区,福田区,南山区,宝安区,龙岗区,盐田区",
珠海市:"香洲区,斗门区,金湾区",
湛江市:"赤坎区,霞山区,坡头区,麻章区,竹溪县,徐闻县,廉江市,雷州市,吴川市"
},
河北省:{
石家庄市:"深泽县,无极县,赵县",
唐山市:"玉田县,遵化市,迁安市"
},
山东省:{
济南市:"历下区,市中区,槐荫区,天桥区,历城区,长清县,平阴县,济阳县,商河县,章丘市",
青岛市:"市南区,市北区,四方区,黄岛区,崂山区,李沧区,城阳区"
} } var provin = document.getElementById('provin');
var city = document.getElementById('city');
var area = document.getElementById('area');
var provinDefaultTxt = provin.options[0].text;
var cityDefaultTxt = city.options[0].text;
var areaDefaultTxt = area.options[0].text;
//获取三个下拉列表元素以及他们的默认值 //开始循环遍历对象data
for(key in data){
var newElemForPro = document.createElement("option");
var newProElemTxt = document.createTextNode(key);
newElemForPro.setAttribute("value",key);
newElemForPro.appendChild(newProElemTxt);
provin.appendChild(newElemForPro);
//把遍历出来的省份名添加到第一个下拉列表中 //当省份下拉列表变化时
provin.onchange = function(){
//获取选中option的索引
var provinSelectedIndex = this.selectedIndex;
//通过选中option的索引找到 option的文本内容
var provinSelectedText = this.options[provinSelectedIndex].text;
//在data数组里面找到对应的键 并将其值赋值给另外一个变量(通过键值对的形式返回出一个对象)
var CityObject = data[provinSelectedText];
//清空city下拉列表的内容
city.options.length = 0; //如果选中了默认值其他两个下拉列表都会变为默认值
if (provinSelectedText == provinDefaultTxt) {
area.options.length = 0;
var cityNewElem = document.createElement("option");
var cityTxt = document.createTextNode(cityDefaultTxt);
var areaNewElem = document.createElement("option");
var areaTxt = document.createTextNode(areaDefaultTxt);
cityNewElem.appendChild(cityTxt);
city.appendChild(cityNewElem);
areaNewElem.appendChild(areaTxt);
area.appendChild(areaNewElem); } //把对应省份的市名对象遍历一次
for(cityKey in CityObject){
var CityElem = document.createElement("option");
var CityElemTxt = document.createTextNode(cityKey);
CityElem.appendChild(CityElemTxt);
CityElem.setAttribute("value",cityKey);
city.appendChild(CityElem);
//把遍历出来的城市名添加到第二个下拉列表中 } //然后这里也是一样 获取选中的城市名索引
var citySelectedIndex = city.selectedIndex;
//根据这个索引找到选中 option的文本值
var citySelectedText = city.options[citySelectedIndex].text;
//通过这个市名的值找到对应的对象然后赋值给一个变量
//因为区/县名是一个字符串所以用 split() 方法将他们以逗号分隔变成一个数组
var areaObject = CityObject[citySelectedText].split(",");
//将第三个下拉框清空
area.options.length = 0; //运用闭包模拟块级作用域 循环中的变量不会永远保存
(function(){
//遍历区/县数组添加到第三个下拉框中
for(var i = 0; i < areaObject.length; i++){
var areaElem = document.createElement("option");
var areaElemTxt = document.createTextNode(areaObject[i]);
areaElem.appendChild(areaElemTxt);
areaElem.setAttribute("value",areaObject[i]);
area.appendChild(areaElem);
}
})(); //当市名下列列表发生变化的时候
city.onchange = function(){
//此时 citySelectedIndex 和 citySelectedText 变量已存在
//将他们直接获取新值就可以了不用再重新声明
citySelectedIndex = city.selectedIndex;
citySelectedText = city.options[citySelectedIndex].text;
//清空区/县下拉列表内容
area.options.length = 0; //根据选中的市名取出对应的区/县名
//同理调用split() 方法变成数组
areaObject = CityObject[citySelectedText].split(",");
(function(){
//遍历数组 添加到区/县下拉列表中
for(var i = 0; i < areaObject.length; i++){
var areaElem = document.createElement("option");
var areaElemTxt = document.createTextNode(areaObject[i]);
areaElem.appendChild(areaElemTxt);
areaElem.setAttribute("value",areaObject[i]);
area.appendChild(areaElem);
}
})();
}
}
} }
</script>
还要说一下以前jq的联动笔记说data是数组其实那时候理解得不够清楚 刚好这几天看高程深刻理解了对象、构造函数以及闭包的原理后才有了更深刻的理解
【实践】用for-in 循环实现三联联动的更多相关文章
- 【实践】jQuery实现三联联动
网上看过很多关于联动的jq或js代码,最近班上的前端大神教了我一种比网上还简单的jq联动方法,自己琢磨过之后确实比其他方法更简单更简洁所以在这里分享一下 先上html代码 <div id=&qu ...
- 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期
三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...
- matlab for循环的三种类型
学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...
- App架构师实践指南六之性能优化三
App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190 内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...
- 用循环将三个DIV变成红色
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript小练习3-用循环使三个DIV变色
题目 初始为黑色,点击后为红色,再次点击为黑色,以后每次点击一次变色. 分析 简单的onclick使用. button的居中可以在外套一个p元素,body中让p居中即可. 三个DIV块的居中,使用ma ...
- MATLAB for循环优化三例
最近一周,对MATLAB有进行了新一轮的学习,对其矩阵化编程的思维有了更深入的了解.确实精妙! 例1: 将矩阵A= [1 2 3; 2 4 3; 3 4 5]中所有的数字3替换为33. 如果还停留在C ...
- for循环的三种写法
第一种写法 传统的方法,遍历数组 String[] arr = { "amy", "heinrich", "cindy", "g ...
- php数组循环的三种方式
PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ...
随机推荐
- Git----创建远程分支,并将文件上传到创建的远程分支上
1.首先创建一个远程仓库 2.将远程仓库克隆到本地 (1)本地新建文件夹,命令行进入文件夹,执行clone操作 (2) git clone git@github.com:Lucky-Syw/lucky ...
- 如何配置Java环境,包括JDK,Maven等
下载JDK并安装 搜索JDK,官网立马就出来了,下载之后个人觉得毕竟开发,毕竟这东西不大,C盘稳一点,安装在C盘可以的 配置 右键打开计算机->属性->高级系统设置->高级-> ...
- ionic3包还原使用yarn命令执行步骤(解决ionic3懒加载报找不到 module的错误)
使用cnpm 还原ionic3.6的依赖包的时候 可以正常还原,但是使用懒加载就会报找不到 module 的错误.最简单的解决办法是删除node_modules 挂个vpn 重新执行npm insta ...
- lsof恢复进程打开的文件
工作原理:进程每打开文件都会生成一个文件句柄FD来标识一个文件,进程打开的文件如果没有被释放,可以通过文件句柄FD来恢复删除的文件 注意:适合恢复进程一直在打开一个文件,例如日志文件,如果配置文件进程 ...
- Druid 架构
本篇译自 Druid 项目白皮书部分内容( https://github.com/apache/incubator-druid/tree/master/publications/whitepaper/ ...
- tp3.23 nginx lnmp填坑
thinkphp3.23在apache上可以轻松实现4个路由模式 但是在nginx上就出现问题 我们的环境是用lnmp包实现(地址:https://lnmp.org/) 安装完成后,ta的lnmp的n ...
- 封装boto3 api用于服务器端与AWS S3交互
由于使用AWS的时候,需要S3来存储重要的数据. 使用Python的boto3时候,很多重要的参数设置有点繁琐. 重新写了一个类来封装操作S3的api.分享一下: https://github.com ...
- 设计模式-模板方法模式(the Template Method Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 模板方法模式简介 这是一个被用的相当广泛的一种设计模式,变体也特别多,他建立一个抽象类定义一个算 ...
- 机房重构包图(从三层+实体到三层+实体+外观+工厂+接口+SQLHelper)
刚刚开始接触三层的时候,我只做了两个登录小窗体的例子.画了简单的包图,可以说,为后面机房重构留下了大量的工作(因为三层理解没有深度,也没有理解出自己的东西).不过,欠下的总要还的.在做机房重构的时候, ...
- [BZOJ4859][BJOI2017]机动训练(DP)
4859: [BeiJing2017]机动训练 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 105 Solved: 63[Submit][Stat ...