http://www.csdn.net/expert/topicview1.asp?id=933535
<html>
<meta name="save" content="history"/>
<script>
/*
关联xml到1个到n个的select
没有做历史记录
*/
function attachxmlforselect(xd,arr,defaulttext,defaultvalue)//xd:xmldom,arr:array of select
{
function ensurestring(str)
{
if(typeof(str)=="string")return str;
if(str==null)return "";
try{return str+"";}catch(x){}
return "";
}
defaulttext=ensurestring(defaulttext);
defaultvalue=ensurestring(defaultvalue);
//检查参数
if(xd==null||xd.documentelement==null||arr==null||arr.length==0)
throw(new error(-1,"invalid arguments"));
//转换成内部的xd
(function(xmldom){
xd=new activexobject("microsoft.xmldom");
xd.loadxml(xmldom.xml);
})(xd)
//把select释放掉,换成uniqueid来储存
for(var i=0;i<arr.length;i++)
arr[i]={
uniqueid:arr[i].uniqueid
,
node:null //当前关联的xml node
,
attach:false //当前是否关联到onselectchange
};
//把第一个select相关的xml node设置为xml的根元素
arr[0].node=xd.documentelement;
//关联第一个select
reattachnode(0);
var controller={
handlechange:handlechange
};
return controller;
//响应用户操作
function onselectchange(event)
{
handlechange(event.srcelement);
}
//处理select可能被修改的情况,确认后面的select正常
function handlechange(s)
{
//取得select在arr中的位置
for(var index=0;index<arr.length;index++)
{
if(s.uniqueid==arr[index].uniqueid)
break;
}
//如果不是最后一个select
if(index<arr.length-1)
{
var node=arr[index].node;
//关联下一个select相关的xml node
if(node)
{
var xns=node.selectnodes("item");
arr[index+1].node=xns.item(s.selectedindex);
}
else arr[index+1].node=null;
//关联下一个select
/*关联递归处*/
reattachnode(index+1);
}
}
//关联,重关联一个select到指定的node
function reattachnode(index)
{
//取当前关联的node
var node=arr[index].node;
var pnode=null;
if(index>0)pnode=arr[index].node;
//取当前select
var s=document.getelementbyid(arr[index].uniqueid);
//清楚当前select的内容
s.innerhtml="";
//如果有defaulttext,那么设置一项
if((node==null||node.selectnodes("item").length==0)&&defaulttext)
{
var o=document.createelement("option");
o.value=defaultvalue;
o.innertext=defaulttext;
s.appendchild(o);
}
//如果关联的node为空,那么取消事件关联
if(node==null)
{
if(arr[index].attach)
{
s.detachevent("onchange",onselectchange);
arr[index].attach=false;
}
/*关联递归处*/
handlechange(s);
return;
}
//如果node不为空
//重新关联事件
if(arr[index].attach==false)
{
s.attachevent("onchange",onselectchange);
arr[index].attach=true;
}
//把子node的值倒入到select中
var xns=node.selectnodes("item");
for(var i=0;i<xns.length;i++)
{
var o=document.createelement("option");
o.value=xns.item(i).getattribute("value");
o.innertext=xns.item(i).getattribute("text");
s.appendchild(o);
}
//这个。。。可能不需要吧。。。
if(s.options.length)
s.selectedindex=0;
/*关联递归处*/
handlechange(s);
}
}
</script>
<body>
<xml id=oxml>
<item>
<item text="text1" value="value1">
<item text="text11" value="value11">
<item text="text111" value="value111"/>
<item text="text112" value="value112"/>