花了半天时间实现一个多级联动下拉框,目的是对某一植物进行“门纲目科属”的归类。使用的技术是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实现多级联动下拉框相关推荐

  1. 二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题

    二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题 三维数组数据源   A - 请选择 -北京市天津市河北省山西省内蒙古自治区辽宁省吉林省黑龙江省上海市江苏省浙江省安徽省福建省江西省山东省河南 ...

  2. html 滚动条置顶,css怎么设置网页下拉条(滚动条)样式?

    很多朋友在网页设计中要自定义下拉条(滚动条)样式的情景,下拉条的样式我们可以通过css来控制的,下拉条能不能换颜色或者做的更好看一些呢?那么滚动条的设置都有哪些呢?下面本篇文章来介绍一下设置下拉条(滚 ...

  3. el-aside修改下拉条为el-scrollbar

    使用elementUI做项目时,经常会用到他的左右结构的容器,尤其是在后台管理系统的页面,就是他的Container 布局容器,左边是el-aside,里面放的是下拉菜单,经常是el-menu 左边的 ...

  4. javascript实现下拉条联动_js实现select二级联动下拉菜单

    本文实例为大家分享了js实现select二级联动下拉菜单,供大家参考,具体内容如下 String path = request.getContextPath(); String basePath = ...

  5. javascript实现下拉条联动_js实现下拉框联动

    今天学习了如何用js实现下拉框的联动,下拉框联动主要指的是当一个下拉框的内容改变时另一个下拉框的内容也会相应的发生改变.比如,我么有时在注册时会需要添加籍贯,当我们选择相应的省份之后,后面的市区也会相 ...

  6. DOM 案例——(美团外卖下拉框菜单、半透明——信息滑入、模态窗口拖拽效果、放大镜效果、滚动条滑到一定位置的固定导航栏、12306购票网站多级联动、斗鱼TV无规则弹幕特效、百度搜索条动态输入下拉瀑布)

    目录 1.缓动动画--美团外卖下拉框菜单 2.半透明--信息滑入 3.模态窗口拖拽效果 4.放大镜效果 5.滚动条滑到一定位置的固定导航栏 6.12306购票网站多级联动 7.斗鱼TV无规则弹幕特效 ...

  7. [译]在启用浏览器功能的INFOPATH表单中实现基于SQL SERVER的多级联动的下拉式列表...

    翻译:实现多级联动的下拉式列表 原文:http://blogs.msdn.com/infopath/archive/2006/10/12/cascading-dropdowns-in-browser- ...

  8. 多级联动下拉菜单插件:jquery.cxselect.js

    话说这个插件,我也用了挺久了,但一直对其具体的作用不是很懂,只知道可以利用 ajax来请求数据,实现类似于多级联动的效果.后来百度了下,在此做个总结吧. 下面是以一名php程序员的角度来分析的...可 ...

  9. layui多级联动下拉框的实现_简单三级联动的实现

    当我们做一些例如注册页面的时候,可能会遇到要选择地址的操作,这时会出现三个选择框,当你选择省级单位的时候会自动在选择筐中,弹出她所属的市级单位的列表,当选择市级单位时又会弹出县级单位,我们要实现的就是 ...

最新文章

  1. 龙邱MPU9250传感器 | 使用ESP32 模块进行测试
  2. 如何在Python中定义二维数组
  3. 2018几大主流的 UI/JS 前端框架
  4. w​i​n​8​.1​无​线​上​网​ ​B​r​o​a​d​c​o​m​ ​8​0​2​.​1​1​n​ ​受​限​问​题
  5. h5-16-SVG 与 HTML5 的 canvas 各自特点
  6. java学习笔记2--数据类型、数组
  7. linux mysql5.7.18多实例_mysql5.7.13二进制包安装多实例
  8. linux-3.5.4内核添加新的系统调用并测试!!!!!
  9. Linux运维 第三阶段 (五) DNS(主从,rndc远程控制,子域授权,视图,压力测试)
  10. 复杂高端木马USB窃贼出现
  11. python PPT批量制作封面图及导出视频教程
  12. python删除txt文本文件第一行数据
  13. 从Robotaxi到环卫、物流,这家自动驾驶公司十倍速拓宽商业化道路
  14. 调用微信扫一扫接口/利用微信JS-SDK调用微信扫一扫功能
  15. python大鱼吃小鱼程序代码_pygame大鱼吃小鱼源代码
  16. 使用echarts实现系统性能动态监控(数据实时展示)
  17. Mac IntelliJ IDEA 2020.1 闪退
  18. 手环、APP监测睡眠可靠吗?
  19. 70. Climbing Stairs. Iter--Sol
  20. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)

热门文章

  1. 静态html页面关键字搜索高亮
  2. Linux小技巧4--如何屏蔽某个特定的网站
  3. 前途未卜的智能音箱,语音助手还差一个杀手级应用
  4. 计算机应用基础试题及答案试卷号7074,电路试卷及的答案.doc
  5. JAVA编程思想笔记 : 并发 [ 一 ]
  6. Flink 清理过期 Checkpoint 目录的正确姿势
  7. IDEA的Maven Show Dependency使用心得
  8. IMDB评分TOP250部给力电影
  9. fiddler mac教程_Mac下使用Fiddler步骤
  10. VR的终极形态是「假眼」?Neuralink前联合创始人掏出新产品:科学之眼!