之前用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 循环实现三联联动的更多相关文章

  1. 【实践】jQuery实现三联联动

    网上看过很多关于联动的jq或js代码,最近班上的前端大神教了我一种比网上还简单的jq联动方法,自己琢磨过之后确实比其他方法更简单更简洁所以在这里分享一下 先上html代码 <div id=&qu ...

  2. 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期

    三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...

  3. matlab for循环的三种类型

    学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...

  4. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  5. 用循环将三个DIV变成红色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. JavaScript小练习3-用循环使三个DIV变色

    题目 初始为黑色,点击后为红色,再次点击为黑色,以后每次点击一次变色. 分析 简单的onclick使用. button的居中可以在外套一个p元素,body中让p居中即可. 三个DIV块的居中,使用ma ...

  7. MATLAB for循环优化三例

    最近一周,对MATLAB有进行了新一轮的学习,对其矩阵化编程的思维有了更深入的了解.确实精妙! 例1: 将矩阵A= [1 2 3; 2 4 3; 3 4 5]中所有的数字3替换为33. 如果还停留在C ...

  8. for循环的三种写法

    第一种写法  传统的方法,遍历数组 String[] arr = { "amy", "heinrich", "cindy", "g ...

  9. php数组循环的三种方式

    PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ...

随机推荐

  1. 开始学习NodeJs, javascript, 算法

    我的技术路线是C.C++.C#.PHP,什么都做过,很杂,总想着该怎么继续下去. 最近突然发现了NodeJs,觉得很适合我. 学习环境定在了Ubuntu下,编辑软件选择了WebStorm7. 经过几天 ...

  2. 封装ajax支持get、post

    为什么要封装ajax,因为…… for(var i=0;i<20;i++){ $.ajax(……) } 的时候,整个页面都卡死了,于是,我开始找答案. 后来,找到了,就是jquery的ajax属 ...

  3. CentOS7.5***

    一.借助谷歌上网助手 二.用ss来实现*** 下载工具 sudo yum install shadowsocks-libev 修改配置文件 sudo chmod 777 /etc/shadowsock ...

  4. getAllResponseHeaders() 必须放到onload里面

    <html><head> <meta charset="utf-8"> <title>test</title> < ...

  5. Oracle基础了解

    数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...

  6. 手机发送验证码—.net代码

    注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...

  7. canvas元素内容生成图片

    转自https://segmentfault.com/a/1190000003853394 想要将canvas元素当前显示的内容生成为图像文件,我们首先要获取canvas中的数据,在HTML5 < ...

  8. 【hihoCoder 第133周】【hihoCoder 1467】2-SAT·hihoCoder音乐节

    http://hihocoder.com/problemset/problem/1467 2-sat模板...详细的题解请看题目里的提示. tarjan模板打错again致命伤qwq #include ...

  9. BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2395 [题目大意] 给出一张无向图,每条边上有a,b两个值,求生成树, 使得suma* ...

  10. 【动态规划】Gym - 101201A - Alphabet

    题意:一个字符串被定义为“alphabetical”,当且仅当它能够删除一些字符,变成“ab...yz”,给你一个只由小写字母组成的字符串,问你最少插入几个字母,使它变成“alphabetical”的 ...