AttachXMLForSelect:XML自动关联多级SELECT菜单代码和
来源:互联网 发布:虚拟光驱软件有哪些 编辑:程序博客网 时间:2024/06/05 00:12
http://www.csdn.net/Expert/TopicView1.asp?id=933535
<HTML>
<META NAME="save" CONTENT="history"/>
<script>
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"/>
<item text="text113" value="value113"/>
<item text="text114" value="value114"/>
</item>
<item text="text12" value="value12">
<item text="text121" value="value121"/>
<item text="text122" value="value122"/>
<item text="text123" value="value123"/>
<item text="text124" value="value124"/>
</item>
<item text="text13" value="value13">
<item text="text131" value="value131"/>
<item text="text132" value="value132"/>
<item text="text133" value="value133"/>
<item text="text134" value="value134"/>
</item>
<item text="text14" value="value14">
<item text="text141" value="value141"/>
<item text="text142" value="value142"/>
<item text="text143" value="value143"/>
<item text="text144" value="value144"/>
</item>
</item>
<item text="text2" value="value2">
<item text="text21" value="value21">
<item text="text211" value="value211"/>
<item text="text212" value="value212"/>
<item text="text213" value="value213"/>
<item text="text214" value="value214"/>
</item>
<item text="text22" value="value22">
<item text="text221" value="value221"/>
<item text="text222" value="value222"/>
<item text="text223" value="value223"/>
<item text="text224" value="value224"/>
</item>
<item text="text23" value="value23">
<item text="text231" value="value231"/>
<item text="text232" value="value232"/>
<item text="text233" value="value233"/>
<item text="text234" value="value234"/>
</item>
<item text="text24" value="value24">
<item text="text241" value="value241"/>
<item text="text242" value="value242"/>
<item text="text243" value="value243"/>
<item text="text244" value="value244"/>
</item>
</item>
</item>
</XML>
<SCRIPT>
function AlertForm(f)
{
alert(
"s1:"+GetSELECTOption(f("s1")).innerText + ":" + GetSELECTOption(f("s1")).value + ""
+
"s2:"+GetSELECTOption(f("s2")).innerText + ":" + GetSELECTOption(f("s2")).value + ""
+
"s3:"+GetSELECTOption(f("s3")).innerText + ":" + GetSELECTOption(f("s3")).value + ""
);
return event.returnValue=false;
}
function GetSELECTOption(s)
{
return s(s.SELECTedIndex);
}
</SCRIPT>
<FORM id=f1 onsubmit="AlertForm(this)"
><SELECT name="s1" style="width:100px;"></SELECT
><SELECT name="s2" style="width:100px;"></SELECT
><SELECT name="s3" style="width:100px;"></SELECT
><INPUT type="submit">
</FORM>
<input type=hidden id=inpSave style="behavior:url(#default#savehistory)" value="000">
</BODY>
<script>
var C=AttachXMLForSELECT(oXML.XMLDocument,[f1("s1"),f1("s2"),f1("s3")]);
//暴露Controller是因为IE5.0没有提供fireEvent,,555555
//下面的代码是储存状态的。
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;
}
</script>
</HTML>
- AttachXMLForSelect:XML自动关联多级SELECT菜单代码和例子
- AttachXMLForSelect:XML自动关联多级SELECT菜单代码和
- AttachXMLForSelect:XML自动关联多级SELECT菜单代码和
- 补上多级关联菜单的代码
- 多级菜单自动收缩
- 多级关联菜单数据库版
- 全国省市县无刷新多级关联菜单[网页特效JS代码]
- C#写的多级关联菜单
- 省市县无刷新多级关联菜单
- Excel技术--多级关联菜单相关(MATCH)
- 多级菜单实现等级自动划分
- 用XSL与XML实现多级菜单
- 两行代码搞定多级关联搜索
- 12864lcd显示屏多级菜单代码实现
- 侧滑菜单xml和代码
- 下拉菜单,滚动图片,多级关联下拉选择框
- 全国省市县无刷新多级关联菜单
- 全国省市县无刷新多级关联菜单
- acm题目及我的程序(4)——正整数n的加法组合的最大乘积(修改)
- SQL循序渐进(12)HAVING子句
- JAVA高手的基础素养
- 使用Shell.Application技术之二
- SQL循序渐进(10)合计函数
- AttachXMLForSelect:XML自动关联多级SELECT菜单代码和
- POST与GET的区别
- SQL循序渐进(11)GROUP BY子句
- Java的一点收获(1)JComboBox
- 2007全球杀毒软件排名 + 2007全球防火墙排名
- SQL循序渐进(9)SELECT语句
- meizz(梅花雨)用javascript写的一个日期输入控件!
- 简约而不简单的金山WPS
- 利用xml数据岛实现多级关联下拉选择框的做法