尽情讨论:多级关联下拉选择框的做法

qiushuiwuhen 2002-05-15 09:38:09
加精
老是看到高分的求多级关联方法,其实用下面方法就简单(昨天随手写的)

<select name=one></select>
<select name=two></select>
<select name=three></select>
<select name=four></select>
<input name=result>

<script>
var arrSel=["one","two","three","four"];//arrSel定义了要修改的下拉框
var i=0,arrData=[];//arrData中搁的是数据,每条都显示各级的数据
arrData[i++]=["2000","4","14","一点"]
arrData[i++]=["2000","4","14","二点"]
arrData[i++]=["2000","4","18","三点"]
arrData[i++]=["2000","7","14","二点"]
arrData[i++]=["2001","6","15","二点"]
arrData[i++]=["2001","6","23","七点"]
arrData[i++]=["2001","8","18","二点"]
arrData[i++]=["2002","7","1","二点"]
arrData[i++]=["2002","7","1","三点"]
arrData[i++]=["2002","7","11","二点"]
arrData[i++]=["2002","7","19","二点"]
</script>
<script>
function qswhInit(num){
/******* by qiushuiwuhen(2002-5-15) ********/
var i,j,arrTemp=[];
for(i=0;i<num;i++)arrTemp[i]=document.all(arrSel[i]).options[document.all(arrSel[i]).selectedIndex].text
if(num==arrSel.length){//这里处理最后的数据。
document.all("result").value="选中了("+arrTemp[0]+","+arrTemp[1]+","+arrTemp[2]+","+arrTemp[3]+")";return;
}
with(document.all(arrSel[num])){
length=0
for(i=0;i<arrData.length;i++){
for(j=0;j<num;j++)if(arrTemp[j]!=arrData[i][j])break;
if(j!=num)continue;
if(length==0||options[length-1].text!=arrData[i][num])
options[length++].text=arrData[i][num];
}
onchange=new Function("qswhInit("+(num+1)+")");
onchange();
}
}
qswhInit(0);//初始化
</script>

写出来的目的是为了避免重复贴子,而且大家可以讨论一下如何才能更完善
...全文
102 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiushuiwuhen 2002-05-17
答非所问,呵呵

谁不贴个xml的?(简要一点)
看xml的价值和精简程度加分
回复
Andrawu 2002-05-17
我已收藏了。
回复
qiushuiwuhen 2002-05-17
对回答满意么?
如果满意就揭帖了,嘿嘿
回复
Andrawu 2002-05-17
upup.....
回复
qiushuiwuhen 2002-05-17
算了,还是我来自言自语吧,结账

<select name=year></select>
<select name=month></select>
<select name=date></select>
<select name=clock></select>
<input name=result>

<script>
var arrSel=["year","month","date","clock"];//arrSel定义了要修改的下拉框和xml数据的节点名称
</script>

<xml id=xmldata>
<xmldata>
<year value="2000">
<month value="4">
<date value="14">
<clock value="一点" />
<clock value="三点" />
</date>
<date value="17">
<clock value="一点" />
</date>
</month>
<month value="5">
<date value="15">
<clock value="一点" />
<clock value="四点" />
<clock value="七点" />
</date>
</month>
</year>
<year value="2001">
<month value="7">
<date value="16">
<clock value="一点" />
<clock value="五点" />
<clock value="九点" />
</date>
</month>
</year>
</xmldata>
</xml>

<script>
function qswhXml(num){
/******* by qiushuiwuhen(2002-5-17) ********/
var i,j,arrTemp=[];
for(i=0;i<num;i++)arrTemp[i]=document.all(arrSel[i]).options[document.all(arrSel[i]).selectedIndex].text
if(num==arrSel.length){//这里处理最后的数据。
document.all("result").value="选中了("+arrTemp+")";return;
}
with(document.all(arrSel[num])){
length=0
var obj=document.all.xmldata.XMLDocument.childNodes[0];
for(i=0;i<num;i++)obj=obj.selectSingleNode(arrSel[i]+'[@value="'+arrTemp[i]+'"]');
for(i=0;i<obj.childNodes.length;i++)options[length++].text=obj.childNodes[i].getAttribute("value");
onchange=new Function("qswhXml("+(num+1)+")");
onchange();
}
}
qswhXml(0);
</script>

回复
NewLi 2002-05-16
如果我有多行需要选择怎么办????
如:
var arrSel1=["one1","two1","three1","four1"];//arrSel1定义了要修改的下拉框
var arrSel2=["one2","two2","three2","four2"];//arrSel2定义了要修改的下拉框
var arrSel3=["one3","two3","three3","four3"];//arrSel3定义了要修改的下拉框
回复
zlgun 2002-05-16
没错
回复
qiushuiwuhen 2002-05-16
你说的是类似于msdn.microsoft.com的树吧?
回复
sunbeamy 2002-05-16
to zlgun(自由人):你的思路是正确的
就像msdn上导航树一样,如果一下子下到客户端肯定开销很大....
下面的例子前些日期草草写的,原来后台是sql server,用xml传输
http://freehost25.websamba.com/yuxiaoyi/Tree/getCode.htm,有兴趣可以研究下
----------------------------------------------------------------
to newli()
只能选择一个被选中的,不然无法连动吧....
回复
zlgun 2002-05-16
既然说到树,大家可以看看台湾同胞做的树形结构^_^(注意看那个ASP版的)
http://dob.tnc.edu.tw/show_page.php?s=454&t=6
我个人认为对于比较庞大的树,一次性把数据放到客户端数组里并不合适,台湾人做的树形结构则是根据用户选择逐步扩充客户端的树。说的不是很清楚
,不过看了例子估计大家会明白的。
回复
qiushuiwuhen 2002-05-16
尽情讨论为的是集群家之长,不喜欢通过发email形式偷偷解决
(有秘密无所谓,至少写出思路,不要糊里糊涂的解决方法)

xml通过xsl过滤是慢,所以需要用js.dom来写,关注中
回复
weidegong 2002-05-15
To sunbeamy(阳光灿烂的深夜)
为什么你要用“好像”呢?我是忘记了的,Sorry

http://thns.tsinghua.edu.cn:2000/lesson/ch06/0602.html
回复
sunbeamy 2002-05-15
同意weidegong(weidegong),平时应用中一直利用xml的与身具来树型结构的特点,做连动菜单和树非常适合....
----------------------------------------------------------------
好象不是二叉树吧;)
回复
weidegong 2002-05-15
那个是15second的树型菜单了。多级级联选单也可以用js写个对象了

这样的话,还要“尽情”讨论吗?
回复
qiushuiwuhen 2002-05-15
http://www.chinavisual.com:81/forum/viewtopic.php?t=34829
回复
weidegong 2002-05-15
提到多级级联的下拉菜单选择,不得不提到另外一种效果:树型菜单。事实上,二者的数据结构是一致的:都是一颗二叉树。为了实现一颗二叉树,可以使用数组或者链表实现(学C的时候用的了)。不过,我觉得最适合的是XML,因为它的数据结构本身就是二叉树了

通过对二叉树的遍历,就可以自动生成一个由XML指定的任意级数的下拉选单,或是树型菜单。

代码曾经贴过...
回复
发动态
发帖子
JavaScript
创建于2007-09-28

8.4w+

社区成员

Web 开发 JavaScript
申请成为版主
社区公告
暂无公告