AttachXMLForSelect:XML自动关联多级SELECT菜单代码和例子[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 lostinet 的 blog

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

本文关键:SELECT 关联 菜单 XML 多级
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top