之前用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. android studio 入门比较好的书籍

    http://blog.csdn.NET/aqi00/article/details/50012511 http://blog.csdn.net/aqi00/article/details/73065 ...

  2. 深刻剖析VuGen脚本录制原理

    扩展:深刻剖析VuGen脚本录制原理 LR中的VuGen组件,主要扮演一个proxy server的角色,在录制脚本时,记录下用户和服务器交互,然后自动生成脚本语言.在接下来的重放,或者大批量地加压时 ...

  3. Python 2.7.13安装

    参考文章:安装Python 进入至Python官方网站,点击下载 下载完成后直接进行安装 选择安装的路径 选择安装的组件,请注意选择安装pip和Add python.exe to Path这两个选项 ...

  4. bss、data、text、heap(堆)与stack(栈)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量(static)的一块内存区域. bss是英文Block Started by Symbol的简称. b ...

  5. Poj2182 Lost Cows(玄学算法)

    题面 Poj 题解 不难发现最后一位就是\(pre[n]+1\),然后消除这个位置对其他位置的贡献,从左到右扫一遍,必定有至少一个位置可以得出,循环这个过程,\(O(n^2)\)出解. #includ ...

  6. 查看所有shell类型

    [xf@xuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/no ...

  7. Flask实战第57天:UEditor编辑器集成以及配置上传文件到七牛

    相关链接 UEditor:http://ueditor.baidu.com/website/​ 下载地址:http://ueditor.baidu.com/website/download.html# ...

  8. Xamarin.Forms教程Android SDK工具下载安装

    Xamarin.Form的Android SDK工具下载安装 本节将讲解如何下载Xamarin.Form的Android SDK工具,并使用其中的工具管理Android SDK,如何创建模拟器等内容. ...

  9. 【POJ 3974】Palindrome

    http://poj.org/problem?id=3974 Manacher模板题.Menci的博客讲得很好 有一点:Menci的代码中的right我感觉是代表能延伸到的最右端点的右边的点,因为r( ...

  10. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...