<HTML> <META NAME="save" CONTENT="history"/> <script> /* 關(guān)聯(lián)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); //檢查參數(shù) if(xd==null||xd.documentElement==null||arr==null||arr.length==0) throw(new Error(-1,"invalid arguments")); //轉(zhuǎn)換成內(nèi)部的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 //當(dāng)前關(guān)聯(lián)的XML Node , attach:false //當(dāng)前是否關(guān)聯(lián)到OnSelectChange }; //把第一個Select相關(guān)的XML node設(shè)置為XML的根元素 arr[0].node=xd.documentElement; //關(guān)聯(lián)第一個Select ReAttachNode(0); var Controller={ HandleChange:HandleChange }; return Controller; //響應(yīng)用戶操作 function OnSelectChange(event) { HandleChange(event.srcElement); } //處理Select可能被修改的情況,確認(rèn)后面的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; //關(guān)聯(lián)下一個Select相關(guān)的XML node if(node) { var xns=node.selectNodes("item"); arr[index+1].node=xns.item(s.selectedIndex); } else arr[index+1].node=null; //關(guān)聯(lián)下一個Select /*關(guān)聯(lián)遞歸處*/ ReAttachNode(index+1); } } //關(guān)聯(lián),重關(guān)聯(lián)一個Select到指定的node function ReAttachNode(index) { //取當(dāng)前關(guān)聯(lián)的node var node=arr[index].node; var pnode=null; if(index>0)pnode=arr[index].node; //取當(dāng)前Select var s=document.getElementById(arr[index].uniqueID); //清楚當(dāng)前Select的內(nèi)容 s.innerHTML=""; //如果有defaultText,那么設(shè)置一項 if((node==null||node.selectNodes("item").length==0)&&defaultText) { var o=document.createElement("OPTION"); o.value=defaultValue; o.innerText=defaultText; s.appendChild(o); } //如果關(guān)聯(lián)的node為空,那么取消事件關(guān)聯(lián) if(node==null) { if(arr[index].attach) { s.detachEvent("onchange",OnSelectChange); arr[index].attach=false; } /*關(guān)聯(lián)遞歸處*/ HandleChange(s); return; } //如果node不為空 //重新關(guān)聯(lián)事件 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; /*關(guān)聯(lián)遞歸處*/ 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:\t"+GetSelectOption(f("s1")).innerText + "\t:\t" + GetSelectOption(f("s1")).value + "\r\n" + "s2:\t"+GetSelectOption(f("s2")).innerText + "\t:\t" + GetSelectOption(f("s2")).value + "\r\n" + "s3:\t"+GetSelectOption(f("s3")).innerText + "\t:\t" + GetSelectOption(f("s3")).value + "\r\n" ); 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 //下面的代碼是儲存狀態(tài)的。 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>
|