AttachXMLForSelect:XML自动关联多级SELECT菜单代码和例子 (转)

AttachXMLForSelect:XML自动关联多级SELECT菜单代码和例子 (转)[@more@]

.NET/Expert/TopicView1.ASP?id=933535">http://www.csdn.net/Expert/TopicView1.asp?id=933535


/*
关联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[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 {
 if(s.uniqueID==arr[index].uniqueID)
 break;
 }
 //如果不是最后一个Select
 if(index {
 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 {
 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);
 }
}




 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



RM id=f1 οnsubmit="AlertForm(this)"
>>>>


//下面的代码是储存状态的。
function window.onload()
{
 var sis=inpSave.value;
 f1("s1").selectedIndex=parseInt(sis.charAt(0));
 C.HandleChange(f1("s1"));
 f1("s2").selectedIndex=parseInt(sis.charAt(1));
 C.HandleChange(f1("s2"));
 f1("s3").selectedIndex=parseInt(sis.charAt(2));
 C.HandleChange(f1("s3")); 
}
function window.onbeforeunload()
{
 inpSave.value=""+f1("s1").selectedIndex+f1("s2").selectedIndex+f1("s3").selectedIndex;
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-992793/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-992793/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值