ASP + XML + #106avascript 实现动态无限级联动菜单

2018-09-06 12:12

阅读:384

  有一编文章是用JavaScript对XML文件操作来实现无限级联动菜单的,我们可结合ASP来完成对数据库值的读取,然后写入XML文件,再用JavaScript读出来并且控制它的联动。
这儿的关键是把数据库内的N层数据类读出来:
我的数据库表结构是这样的:
tbl_Class
列名数据类型长度说明
ClassID int 4类ID
ModuleID int 4模块ID
GroupID int 2标识一个组
ClassName nvarchar 50 类别名称
ParentID int 2连接到组(0表示是父类)

  
####################################我的ASP代码如下##########################################
我把连接数据库的代码忽略。

  
函数名字:OpenXml(FileName)
入口参数: filename 需要连接或打开的xml文件名
返回值 :XmlDoc就是一个成功装载XML文档的对象了。
有错误则打印错误信息strError
------------------------------------------------

  function OpenXml(filename)
dim strSourceFile ,XmlDoc,strError
strSourceFile = filename
Set XmlDoc = Server.CreateObject(Microsoft.XMLDOM) 创建XMLDOM实例
XmlDoc.async = false
XmlDoc.load(strSourceFile)
OpenXml=XmlDoc.parseerror.errorcode
if XmlDoc.parseerror.errorcode<>0 then
strError=<h2>errorXmlDoc.parseerror.errorcode</h2>
strError=strErrorXmlDoc.parseerror.reason<br>
strError=strErrorXmlDoc.parseerror.url<br>
strError=strErrorXmlDoc.parseerror.line<br>
strError=strErrorXmlDoc.parseerror.filepos<br>
strError=strErrorXmlDoc.parseerror.srcText<br>
response.write strError 输出错误
else
set OpenXml=XmlDoc 返回实例
end if
end function

  
------------------------------------------------
函数名字:CloseXml()
参数: XmlDoc XML组件实例
------------------------------------------------
function CloseXml(XmlDoc)
if IsObject(XmlDoc) then
set XmlDoc=nothing
end if
end function

  
------------------------------------------------
函数名字:SelectXmlNode
参数:XmlDoc XML组件实例
e 元素的名字
返回元素实例
------------------------------------------------
function SelectXmlNode(XmlDoc,e)
dim n

   set n=XmlDoc.selectSingleNode(// e )
set selectXmlNode= n

  end function

  
Dim n,np,MaxGroup,root,xmlDoc,nt,filename,s,ss,TorF
filename=server.mappath(demo.xml)
set xmlDoc=openXML(filename)打开XML
RemoveAllNodes xmlDoc,Root把Root和它下面的子项清除,这样可以多次方便读写
set root= xmlDoc.createElement(Root)
xmlDoc.appendChild root创建一个顶层元素
sql=select Max(GroupID) from tbl_Class 读出最大的层次
set rs=cn.execute(sql)
if isnull(rs(0)) then MaxGroup=0 else MaxGroup=rs(0)如果为null 表示没有数据
s=:ss=
set nt=xmldoc.createElement(item)
nt.setAttribute text, 请选择
root.appendChild nt 创建一个元素
for i=1 to MaxGroup 开始循环
sql=select * from tbl_Class where GroupID= i 由底层向顶层读取
set rs=cn.execute(sql)
TorF=False 为了每一个层上都创建一个“请选择”的空取。
do while rs.eof =false 开始读取下层的数据
Set n = xmlDoc.createElement(item rs(ClassID)) 创建一个命名为item + ID号的标记元素
n.setAttribute text,rs(ClassName)把它的属性“text”设置为数据库表内的

  ClassName
n.setAttribute value,rs(ClassID)把它的属性“value”设置为数据库表内的

  ClassID
if rs(ParentID)>0 then 是有上层数据的
set np=selectXmlNode(xmlDoc,item rs(ParentID)) 把它的上层数据元素先读出保存在np
if TorF=false then 如果TorF为False值时
set nt=xmldoc.createElement(item) 创建一个元素保存在nt
nt.setAttribute text, 请选择把它的text属性设置为“请选择”
np.appendChild nt np把它加为子元素
end if
TorF=true 设置true
np.appendChild n np 把n加为子元素
else
root.appendChild n 如果是第一层数据就把它加入为root下的一个子元素
end if
rs.movenext 下一条指针
loop

ss=ss <SELECT id=Select i width=1 ></SELECT></span> 每有一层就创建一个

  <select>
s=s ,Select i 把每个<select>的id 保存在变量s,它的格式为:id1,id2,id3,id4

next
xmlDoc.save filename 正式保存Xml文件
CloseXml xmlDoc 关闭Xml文件


response.write ss 直接把<select>输出到文档
s=mid(s,2)

  //在HTM文件内调用xmlselect.js
<SCRIPT language=JavaScript src=xmlselect.js></SCRIPT>
<SCRIPT language=JavaScript>
<!--//** power by fason
function init() {
var Sel = [<%=s%>];
attachSelect(demo.xml, Sel,[论坛导航]);
};//-->
</SCRIPT>
init();

  
//#########我把它的JS代码贴出来,作者叫:蒲佛信,这儿有示例和代码。

  //-----------------------------xmlselect.js文件开始-------------------------------

  //-----------------------------------------------------/
//NichName:fason
//Autho:Forbes Pu(蒲佛信)
//HomePage:
//Blog:
//
//
// function:attachSelect(sXMLSrc, aSel[, sStore])
//param1:sXMLSrc(URL of XML data source)
//param2:aSel(array of SELECT controlss ID)
//param3:array of default value when display
//-----------------------------------------------------/

  
function attachSelect(sXMLSrc, aSel, sStore) {
var oXML = CreateXmlDocument();
var oDocument = null;
var store = sStore ? sStore : [];
var Sel = new Array();

  for (var i=0; i<aSel.length; i++)
Sel[i] = document.getElementById(aSel[i]);

if (!oXML){ throw new Error(Not support! please install a XML parser);return; }
oXML.onreadystatechange = function () {
if (oXML.readyState == 4) {
attachXML();
}
};
oXML.load(sXMLSrc);

  function CreateXmlDocument() {
if (document.implementation document.implementation.createDocument) {
var doc = document.implementation.createDocument(, , null);
if (doc.readyState == null) {
&


评论


亲,登录后才可以留言!