php下拉框多级联动,js实现多级联动下拉框

这段代码实现了一个基于XML数据的下拉框联动功能,主要用于生物分类的选取,包括门、纲、目、科、属。当用户在某个下拉框选择一个选项时,会根据所选内容更新下一级别的下拉框选项,同时禁用已选择的下拉框及其后续级别,确保数据的层级关系正确展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大概的思路:

1、读取xml文件

2、当一个下拉框选中某选项时,根据该选项,当前节点指向下一层,进入下一层下拉框的设置

3、取消当前下拉框的禁用,禁用下一层的下拉框

4、清空当前下拉框的选项

5、根据当前节点读取xml的数据,设置下拉框选项

6、返回步骤2

JS代码:

var xmlDoc;

var browserType;

var currentNode;//当前所在节点

setBrowserType();

loadXml("classify.xml");

//读取xml文件数据并设置门、纲、目、科、属的下拉框

//设置“门”的下拉框

function setPhylum(){

currentNode=xmlDoc.documentElement;

var phylums=xmlDoc.documentElement.childNodes;

var phylumName;

if(browserType=="IE"){

for(var i=0;i

//从门到属,都有name属性标签,并且所有下拉框选项索引都是从1开始

phylumName=phylums[i].selectNodes("name")[0].text;

document.forms[0].phylum.options[i+1]=new Option(phylumName,phylumName);

}

}

else{//FF

//FireFox没有selectNodes()方法,且其childNodes的对应索引是1,3,5,7...

for(var i=1;i

phylumName=phylums[i].childNodes[1].textContent;

document.forms[0].phylum.options[(i+1)/2]=new Option(phylumName,phylumName);

}

document.forms[0].clazz.disabled="disabled";

document.forms[0].order.disabled="disabled";

document.forms[0].family.disabled="disabled";

document.forms[0].genus.disabled="disabled";

}

}

//设置“纲”的下拉框

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";

clearOption(document.forms[0].clazz);

var clazzes;

var clazzName;

//将选中的门节点作为当前节点,注意这里需要将索引回减1

//因为门的父节点没有name属性标签,而下拉框的索引又是从1开始

//currentNode的赋值应使用绝对定位,也是因应各下拉框的无序选择

//currentNode=currentNode.childNodes(selectedIndex-1);

if(browserType=="IE"){

currentNode=xmlDoc.documentElement.childNodes(selectedIndex-1);

clazzes=currentNode.childNodes;

//因为门节点的第一个子节点为name属性标签,故循环时索引从1开始

//相应的下拉框的索引就与纲节点的索引同步(不需要options[i+1]),目、科、属也是一样

for(var i=1;i

clazzName=clazzes[i].selectNodes("name")[0].text;

document.forms[0].clazz.options[i]=new Option(clazzName,clazzName);

}

}

else{//FF

currentNode=xmlDoc.documentElement.childNodes[selectedIndex*2-1];

clazzes=currentNode.childNodes;

for(var i=1;i

clazzName=clazzes[i+2].childNodes[1].textContent;

document.forms[0].clazz.options[(i+1)/2]=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";

clearOption(document.forms[0].order);

var orderName;

//currentNode的赋值应使用绝对定位

var phylumSI=document.forms[0].phylum.selectedIndex;    //phylum selected index

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes[phylumSI-1]

.childNodes[selectedIndex];

var orders=currentNode.childNodes;

for(var i=1;i

orderName=orders[i].selectNodes("name")[0].text;

document.forms[0].order.options[i]=new Option(orderName,orderName);

}

}else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[selectedIndex*2+1];

var orders=currentNode.childNodes;

for(var i=1;i

orderName=orders[i+2].childNodes[1].textContent;

document.forms[0].order.options[(i+1)/2]=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

clearOption(document.forms[0].family);

var families;

var familyName;

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes[phylumSI-1]

.childNodes[clazzSI]

.childNodes[selectedIndex];

families=currentNode.childNodes;

for(var i=1;i

familyName=families[i].selectNodes("name")[0].text;

document.forms[0].family.options[i]=new Option(familyName,familyName);

}

}

else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[clazzSI*2+1]

.childNodes[selectedIndex*2+1];

families=currentNode.childNodes;

for(var i=1;i

familyName=families[i+2].childNodes[1].textContent;

document.forms[0].family.options[(i+1)/2]=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

clearOption(document.forms[0].genus);

var genues;

var genusName;

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes(phylumSI-1)

.childNodes(clazzSI)

.childNodes(orderSI)

.childNodes(selectedIndex);

genuses=currentNode.childNodes;

for(var i=1;i

//属为叶节点

var genusName=genuses[i].text;

document.forms[0].genus.options[i]=new Option(genusName,genusName);

}

}

else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[clazzSI*2+1]

.childNodes[orderSI*2+1]

.childNodes[selectedIndex*2+1];

genuses=currentNode.childNodes;

for(var i=1;i

//属为叶节点

var genusName=genuses[i+2].textContent;

document.forms[0].genus.options[(i+1)/2]=new Option(genusName,genusName);

}

}

}

//清空下拉框选项

function clearOption(selectElement){

for(var i=1;i

selectElement.options[i]=null;

}

}

//判断浏览器类型

function setBrowserType(){

if (window.ActiveXObject){//IE

browserType="IE";

}else{

browserType="FireFox";

}

}

//载入xml

function loadXml(xmlName){

if (browserType=="IE"){//IE

xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

xmlDoc.async = false;

xmlDoc.load(xmlName);

} else{

//      xmlDoc=document.implementation.createDocument("", "", null);

//      xmlDoc.async = false;

//      xmlDoc.load("classify.xml");

browserType="FireFox";

var xmlHttp = new XMLHttpRequest();

xmlHttp.open( "GET", "classify.xml", false ) ;

xmlHttp.send(null) ;

xmlDoc=xmlHttp.responseXML;

//FireFox没有selectNodes()方法,且xml中,其childNodes的对应索引是1,3,5,7...

//      alert(xmlDoc.getElementsByTagName("phylum")[1]

//          .childNodes[3].childNodes[3].childNodes[1].textContent);

}

}

var xmlDoc;

var browserType;

var currentNode;//当前所在节点

setBrowserType();

loadXml("classify.xml");

//读取xml文件数据并设置门、纲、目、科、属的下拉框

//设置“门”的下拉框

function setPhylum(){

currentNode=xmlDoc.documentElement;

var phylums=xmlDoc.documentElement.childNodes;

var phylumName;

if(browserType=="IE"){

for(var i=0;i

//从门到属,都有name属性标签,并且所有下拉框选项索引都是从1开始

phylumName=phylums[i].selectNodes("name")[0].text;

document.forms[0].phylum.options[i+1]=new Option(phylumName,phylumName);

}

}

else{//FF

//FireFox没有selectNodes()方法,且其childNodes的对应索引是1,3,5,7...

for(var i=1;i

phylumName=phylums[i].childNodes[1].textContent;

document.forms[0].phylum.options[(i+1)/2]=new Option(phylumName,phylumName);

}

document.forms[0].clazz.disabled="disabled";

document.forms[0].order.disabled="disabled";

document.forms[0].family.disabled="disabled";

document.forms[0].genus.disabled="disabled";

}

}

//设置“纲”的下拉框

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";

clearOption(document.forms[0].clazz);

var clazzes;

var clazzName;

//将选中的门节点作为当前节点,注意这里需要将索引回减1

//因为门的父节点没有name属性标签,而下拉框的索引又是从1开始

//currentNode的赋值应使用绝对定位,也是因应各下拉框的无序选择

//currentNode=currentNode.childNodes(selectedIndex-1);

if(browserType=="IE"){

currentNode=xmlDoc.documentElement.childNodes(selectedIndex-1);

clazzes=currentNode.childNodes;

//因为门节点的第一个子节点为name属性标签,故循环时索引从1开始

//相应的下拉框的索引就与纲节点的索引同步(不需要options[i+1]),目、科、属也是一样

for(var i=1;i

clazzName=clazzes[i].selectNodes("name")[0].text;

document.forms[0].clazz.options[i]=new Option(clazzName,clazzName);

}

}

else{//FF

currentNode=xmlDoc.documentElement.childNodes[selectedIndex*2-1];

clazzes=currentNode.childNodes;

for(var i=1;i

clazzName=clazzes[i+2].childNodes[1].textContent;

document.forms[0].clazz.options[(i+1)/2]=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";

clearOption(document.forms[0].order);

var orderName;

//currentNode的赋值应使用绝对定位

var phylumSI=document.forms[0].phylum.selectedIndex;//phylum selected index

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes[phylumSI-1]

.childNodes[selectedIndex];

var orders=currentNode.childNodes;

for(var i=1;i

orderName=orders[i].selectNodes("name")[0].text;

document.forms[0].order.options[i]=new Option(orderName,orderName);

}

}else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[selectedIndex*2+1];

var orders=currentNode.childNodes;

for(var i=1;i

orderName=orders[i+2].childNodes[1].textContent;

document.forms[0].order.options[(i+1)/2]=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

clearOption(document.forms[0].family);

var families;

var familyName;

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes[phylumSI-1]

.childNodes[clazzSI]

.childNodes[selectedIndex];

families=currentNode.childNodes;

for(var i=1;i

familyName=families[i].selectNodes("name")[0].text;

document.forms[0].family.options[i]=new Option(familyName,familyName);

}

}

else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[clazzSI*2+1]

.childNodes[selectedIndex*2+1];

families=currentNode.childNodes;

for(var i=1;i

familyName=families[i+2].childNodes[1].textContent;

document.forms[0].family.options[(i+1)/2]=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

clearOption(document.forms[0].genus);

var genues;

var genusName;

if(browserType=="IE"){

currentNode=xmlDoc.documentElement

.childNodes(phylumSI-1)

.childNodes(clazzSI)

.childNodes(orderSI)

.childNodes(selectedIndex);

genuses=currentNode.childNodes;

for(var i=1;i

//属为叶节点

var genusName=genuses[i].text;

document.forms[0].genus.options[i]=new Option(genusName,genusName);

}

}

else{

currentNode=xmlDoc.documentElement

.childNodes[phylumSI*2-1]

.childNodes[clazzSI*2+1]

.childNodes[orderSI*2+1]

.childNodes[selectedIndex*2+1];

genuses=currentNode.childNodes;

for(var i=1;i

//属为叶节点

var genusName=genuses[i+2].textContent;

document.forms[0].genus.options[(i+1)/2]=new Option(genusName,genusName);

}

}

}

//清空下拉框选项

function clearOption(selectElement){

for(var i=1;i

selectElement.options[i]=null;

}

}

//判断浏览器类型

function setBrowserType(){

if (window.ActiveXObject){//IE

browserType="IE";

}else{

browserType="FireFox";

}

}

//载入xml

function loadXml(xmlName){

if (browserType=="IE"){//IE

xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

xmlDoc.async = false;

xmlDoc.load(xmlName);

} else{

//xmlDoc=document.implementation.createDocument("", "", null);

//xmlDoc.async = false;

//xmlDoc.load("classify.xml");

browserType="FireFox";

var xmlHttp = new XMLHttpRequest();

xmlHttp.open( "GET", "classify.xml", false ) ;

xmlHttp.send(null) ;

xmlDoc=xmlHttp.responseXML;

//FireFox没有selectNodes()方法,且xml中,其childNodes的对应索引是1,3,5,7...

// alert(xmlDoc.getElementsByTagName("phylum")[1]

// .childNodes[3].childNodes[3].childNodes[1].textContent);

}

}

XML代码:

被子植物门

双子叶植物纲

菊目

菊科

菊属

桔梗科

同钟花属

刺萼参属

胡椒目

胡椒科

胡椒属

草胡椒属

齐头绒属

蕨类植物门

石松纲

石松目

石松科

石松属

效果图:

d83db17e-e822-3b3d-ad3f-ce3ff28b085e.jpg

f48d1c11-15fc-3e08-9792-6dce1802f1dc.jpg

b1e8bb87-0eae-39cc-a871-2db883184db4.jpg

5ec979c6-513c-315e-9855-893d46deeb1b.jpg

67745ee3-7e44-3356-a387-67578c4b1391.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值