javascript实现下拉条联动_js实现多级联动下拉框
花了半天时间实现一个多级联动下拉框,目的是对某一植物进行“门纲目科属”的归类。使用的技术是javascript+xml,之所以不用数据库,一来这方面的数据虽然量大但都是固定不变的,二来不希望加重服务器的负担,第三是因为这种多级从属关系的数据不太适合放在数据库里。
这是大概的思路:
1、读取xml文件
2、当一个下拉框选中某选项时,根据该选项,当前节点指向下一层,进入下一层下拉框的设置
3、取消当前下拉框的禁用,禁用下一层的下拉框
4、清空当前下拉框的选项
5、根据当前节点读取xml的数据,设置下拉框选项
6、返回步骤2
代码:
JavaScript
Javascript代码
//载入xml文件
varxmlDoc=newActiveXObject("Microsoft.XMLDOM");
xmlDoc.async =false;
xmlDoc.load("classify.xml");
varcurrentNode;//当前所在节点
//读取xml文件数据并设置门、纲、目、科、属的下拉框
//设置“门”的下拉框
functionsetPhylum(){
currentNode=xmlDoc.documentElement;
varphylums = currentNode.childNodes;
for(vari=0;i
//从门到属,都有name属性标签,并且所有下拉框选项索引都是从1开始
varphylumName=phylums(i).selectNodes("name")(0).text;
document.forms[0].phylum.options[i+1]=newOption(phylumName,phylumName);
}
}
//设置“纲”的下拉框
functionsetClazz(selectedIndex){
//取消下拉框的禁用
//后面的下拉框禁用,这是因应各下拉框的无序选择可能产生的错误
//比如选了“科”又回头重新选“目”,或更改同一个下拉框选项)
document.forms[0].clazz.disabled=null;
document.forms[0].order.disabled="disabled";
document.forms[0].family.disabled="disabled";
document.forms[0].genus.disabled="disabled";
//将选中的门节点作为当前节点,注意这里需要将索引回减1
//因为门的父节点没有name属性标签,而下拉框的索引又是从1开始
//currentNode的赋值应使用绝对定位,也是因应各下拉框的无序选择
//currentNode=currentNode.childNodes(selectedIndex-1);
currentNode=xmlDoc.documentElement.childNodes(selectedIndex-1);
varclazzes=currentNode.childNodes;
clearOption(document.forms[0].clazz);
//因为门节点的第一个子节点为name属性标签,故循环时索引从1开始
//相应的下拉框的索引就与纲节点的索引同步(不需要options[i+1]),目、科、属也是一样
for(vari=1;i
varclazzName=clazzes(i).selectNodes("name")(0).text;
document.forms[0].clazz.options[i]=newOption(clazzName,clazzName);
}
}
//设置“目”的下拉框
functionsetOrder(selectedIndex){
//取消下拉框的禁用
//后面的下拉框禁用,这是因应各下拉框的无序选择可能产生的错误(比如选了“科”又回头重新选“目”)
document.forms[0].order.disabled=null;
document.forms[0].family.disabled="disabled";
document.forms[0].genus.disabled="disabled";
//currentNode的赋值应使用绝对定位
varphylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(selectedIndex);
varorders=currentNode.childNodes;
clearOption(document.forms[0].order);
for(vari=1;i
varorderName=orders(i).selectNodes("name")(0).text;
document.forms[0].order.options[i]=newOption(orderName,orderName);
}
}
//设置“科”的下拉框
functionsetFamily(selectedIndex){
document.forms[0].family.disabled=null;//取消下拉框的禁用
document.forms[0].genus.disabled="disabled";//后面的下拉框禁用
//currentNode的赋值应使用绝对定位
varphylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
varclazzSI=document.forms[0].clazz.selectedIndex;//clazz selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(clazzSI)
.childNodes(selectedIndex);
varfamilies=currentNode.childNodes;
clearOption(document.forms[0].family);
for(vari=1;i
varfamilyName=families(i).selectNodes("name")(0).text;
document.forms[0].family.options[i]=newOption(familyName,familyName);
}
}
//设置“属”的下拉框
functionsetGenus(selectedIndex){
document.forms[0].genus.disabled=null;//取消下拉框的禁用
//currentNode的赋值应使用绝对定位
varphylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
varclazzSI=document.forms[0].clazz.selectedIndex;//clazz selected index
varorderSI=document.forms[0].order.selectedIndex;//order selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(clazzSI)
.childNodes(orderSI)
.childNodes(selectedIndex);
vargenuses=currentNode.childNodes;
clearOption(document.forms[0].genus);
for(vari=1;i
//属为叶节点
vargenusName=genuses(i).text;
document.forms[0].genus.options[i]=newOption(genusName,genusName);
}
}
//清空下拉框选项
functionclearOption(selectElement){
for(vari=1;i
selectElement.options[i]=null;
}
}
//载入xml文件
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("classify.xml");
var currentNode;//当前所在节点
//读取xml文件数据并设置门、纲、目、科、属的下拉框
//设置“门”的下拉框
function setPhylum(){
currentNode=xmlDoc.documentElement;
var phylums = currentNode.childNodes;
for(var i=0;i
//从门到属,都有name属性标签,并且所有下拉框选项索引都是从1开始
var phylumName=phylums(i).selectNodes("name")(0).text;
document.forms[0].phylum.options[i+1]=new Option(phylumName,phylumName);
}
}
//设置“纲”的下拉框
function setClazz(selectedIndex){
//取消下拉框的禁用
//后面的下拉框禁用,这是因应各下拉框的无序选择可能产生的错误
//比如选了“科”又回头重新选“目”,或更改同一个下拉框选项)
document.forms[0].clazz.disabled=null;
document.forms[0].order.disabled="disabled";
document.forms[0].family.disabled="disabled";
document.forms[0].genus.disabled="disabled";
//将选中的门节点作为当前节点,注意这里需要将索引回减1
//因为门的父节点没有name属性标签,而下拉框的索引又是从1开始
//currentNode的赋值应使用绝对定位,也是因应各下拉框的无序选择
//currentNode=currentNode.childNodes(selectedIndex-1);
currentNode=xmlDoc.documentElement.childNodes(selectedIndex-1);
var clazzes=currentNode.childNodes;
clearOption(document.forms[0].clazz);
//因为门节点的第一个子节点为name属性标签,故循环时索引从1开始
//相应的下拉框的索引就与纲节点的索引同步(不需要options[i+1]),目、科、属也是一样
for(var i=1;i
var clazzName=clazzes(i).selectNodes("name")(0).text;
document.forms[0].clazz.options[i]=new Option(clazzName,clazzName);
}
}
//设置“目”的下拉框
function setOrder(selectedIndex){
//取消下拉框的禁用
//后面的下拉框禁用,这是因应各下拉框的无序选择可能产生的错误(比如选了“科”又回头重新选“目”)
document.forms[0].order.disabled=null;
document.forms[0].family.disabled="disabled";
document.forms[0].genus.disabled="disabled";
//currentNode的赋值应使用绝对定位
var phylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(selectedIndex);
var orders=currentNode.childNodes;
clearOption(document.forms[0].order);
for(var i=1;i
var orderName=orders(i).selectNodes("name")(0).text;
document.forms[0].order.options[i]=new Option(orderName,orderName);
}
}
//设置“科”的下拉框
function setFamily(selectedIndex){
document.forms[0].family.disabled=null;//取消下拉框的禁用
document.forms[0].genus.disabled="disabled";//后面的下拉框禁用
//currentNode的赋值应使用绝对定位
var phylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
var clazzSI=document.forms[0].clazz.selectedIndex;//clazz selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(clazzSI)
.childNodes(selectedIndex);
var families=currentNode.childNodes;
clearOption(document.forms[0].family);
for(var i=1;i
var familyName=families(i).selectNodes("name")(0).text;
document.forms[0].family.options[i]=new Option(familyName,familyName);
}
}
//设置“属”的下拉框
function setGenus(selectedIndex){
document.forms[0].genus.disabled=null;//取消下拉框的禁用
//currentNode的赋值应使用绝对定位
var phylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index
var clazzSI=document.forms[0].clazz.selectedIndex;//clazz selected index
var orderSI=document.forms[0].order.selectedIndex;//order selected index
currentNode=xmlDoc.documentElement
.childNodes(phylumSI-1)
.childNodes(clazzSI)
.childNodes(orderSI)
.childNodes(selectedIndex);
var genuses=currentNode.childNodes;
clearOption(document.forms[0].genus);
for(var i=1;i
//属为叶节点
var genusName=genuses(i).text;
document.forms[0].genus.options[i]=new Option(genusName,genusName);
}
}
//清空下拉框选项
function clearOption(selectElement){
for(var i=1;i
selectElement.options[i]=null;
}
}
html
Html代码
οnchange="setClazz(this.selectedIndex)">
———门———
οnchange="setOrder(this.selectedIndex)">
———纲———
οnchange="setFamily(this.selectedIndex)">
———目———
οnchange="setGenus(this.selectedIndex)">
———科———
———属———
setPhylum();//设置第一个下拉框
οnchange="setClazz(this.selectedIndex)">
———门———
οnchange="setOrder(this.selectedIndex)">
———纲———
οnchange="setFamily(this.selectedIndex)">
———目———
οnchange="setGenus(this.selectedIndex)">
———科———
———属———
setPhylum();//设置第一个下拉框
最后是xml文件的内容
Xml代码
被子植物门
双子叶植物纲
菊目
菊科
菊属
桔梗科
同钟花属
刺萼参属
胡椒目
胡椒科
胡椒属
草胡椒属
齐头绒属
蕨类植物门
石松纲
石松目
石松科
石松属
被子植物门
双子叶植物纲
菊目
菊科
菊属
桔梗科
同钟花属
刺萼参属
胡椒目
胡椒科
胡椒属
草胡椒属
齐头绒属
蕨类植物门
石松纲
石松目
石松科
石松属
可以实现上下级下拉框的联动,支持无序选择,若向上重新选择,下下层下拉框将自动被禁用,下层下拉框选项也会相应改变。
有一点不足是,因为数据量实在太大,这样5个下拉框仍然可能出现某下拉框有几百甚至几千个选项,此时就失去了下拉框的意义,因此正在考虑是否应该做成输入框的形式,或者像搜索引擎那样带有输入提示功能,研究中,欢迎拍砖。
javascript实现下拉条联动_js实现多级联动下拉框相关推荐
- 二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题
二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题 三维数组数据源 A - 请选择 -北京市天津市河北省山西省内蒙古自治区辽宁省吉林省黑龙江省上海市江苏省浙江省安徽省福建省江西省山东省河南 ...
- html 滚动条置顶,css怎么设置网页下拉条(滚动条)样式?
很多朋友在网页设计中要自定义下拉条(滚动条)样式的情景,下拉条的样式我们可以通过css来控制的,下拉条能不能换颜色或者做的更好看一些呢?那么滚动条的设置都有哪些呢?下面本篇文章来介绍一下设置下拉条(滚 ...
- el-aside修改下拉条为el-scrollbar
使用elementUI做项目时,经常会用到他的左右结构的容器,尤其是在后台管理系统的页面,就是他的Container 布局容器,左边是el-aside,里面放的是下拉菜单,经常是el-menu 左边的 ...
- javascript实现下拉条联动_js实现select二级联动下拉菜单
本文实例为大家分享了js实现select二级联动下拉菜单,供大家参考,具体内容如下 String path = request.getContextPath(); String basePath = ...
- javascript实现下拉条联动_js实现下拉框联动
今天学习了如何用js实现下拉框的联动,下拉框联动主要指的是当一个下拉框的内容改变时另一个下拉框的内容也会相应的发生改变.比如,我么有时在注册时会需要添加籍贯,当我们选择相应的省份之后,后面的市区也会相 ...
- DOM 案例——(美团外卖下拉框菜单、半透明——信息滑入、模态窗口拖拽效果、放大镜效果、滚动条滑到一定位置的固定导航栏、12306购票网站多级联动、斗鱼TV无规则弹幕特效、百度搜索条动态输入下拉瀑布)
目录 1.缓动动画--美团外卖下拉框菜单 2.半透明--信息滑入 3.模态窗口拖拽效果 4.放大镜效果 5.滚动条滑到一定位置的固定导航栏 6.12306购票网站多级联动 7.斗鱼TV无规则弹幕特效 ...
- [译]在启用浏览器功能的INFOPATH表单中实现基于SQL SERVER的多级联动的下拉式列表...
翻译:实现多级联动的下拉式列表 原文:http://blogs.msdn.com/infopath/archive/2006/10/12/cascading-dropdowns-in-browser- ...
- 多级联动下拉菜单插件:jquery.cxselect.js
话说这个插件,我也用了挺久了,但一直对其具体的作用不是很懂,只知道可以利用 ajax来请求数据,实现类似于多级联动的效果.后来百度了下,在此做个总结吧. 下面是以一名php程序员的角度来分析的...可 ...
- layui多级联动下拉框的实现_简单三级联动的实现
当我们做一些例如注册页面的时候,可能会遇到要选择地址的操作,这时会出现三个选择框,当你选择省级单位的时候会自动在选择筐中,弹出她所属的市级单位的列表,当选择市级单位时又会弹出县级单位,我们要实现的就是 ...
最新文章
- 龙邱MPU9250传感器 | 使用ESP32 模块进行测试
- 如何在Python中定义二维数组
- 2018几大主流的 UI/JS 前端框架
- w​i​n​8​.1​无​线​上​网​ ​B​r​o​a​d​c​o​m​ ​8​0​2​.​1​1​n​ ​受​限​问​题
- h5-16-SVG 与 HTML5 的 canvas 各自特点
- java学习笔记2--数据类型、数组
- linux mysql5.7.18多实例_mysql5.7.13二进制包安装多实例
- linux-3.5.4内核添加新的系统调用并测试!!!!!
- Linux运维 第三阶段 (五) DNS(主从,rndc远程控制,子域授权,视图,压力测试)
- 复杂高端木马USB窃贼出现
- python PPT批量制作封面图及导出视频教程
- python删除txt文本文件第一行数据
- 从Robotaxi到环卫、物流,这家自动驾驶公司十倍速拓宽商业化道路
- 调用微信扫一扫接口/利用微信JS-SDK调用微信扫一扫功能
- python大鱼吃小鱼程序代码_pygame大鱼吃小鱼源代码
- 使用echarts实现系统性能动态监控(数据实时展示)
- Mac IntelliJ IDEA 2020.1 闪退
- 手环、APP监测睡眠可靠吗?
- 70. Climbing Stairs. Iter--Sol
- 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
热门文章
- 静态html页面关键字搜索高亮
- Linux小技巧4--如何屏蔽某个特定的网站
- 前途未卜的智能音箱,语音助手还差一个杀手级应用
- 计算机应用基础试题及答案试卷号7074,电路试卷及的答案.doc
- JAVA编程思想笔记 : 并发 [ 一 ]
- Flink 清理过期 Checkpoint 目录的正确姿势
- IDEA的Maven Show Dependency使用心得
- IMDB评分TOP250部给力电影
- fiddler mac教程_Mac下使用Fiddler步骤
- VR的终极形态是「假眼」?Neuralink前联合创始人掏出新产品:科学之眼!