欢迎光临
我们一直在努力

ASP + XML + JavaScript 实现动态无限级联动菜单-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

结合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>error"&xmldoc.parseerror.errorcode&"</h2>"

strerror=strerror&xmldoc.parseerror.reason&"<br>"

strerror=strerror&xmldoc.parseerror.url&"<br>"

strerror=strerror&xmldoc.parseerror.line&"<br>"

strerror=strerror&xmldoc.parseerror.filepos&"<br>"

strerror=strerror&xmldoc.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代码贴出来,作者叫:蒲佛信,http://fason.nease.net/samples/xmlselect/这儿有示例和代码。

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

//—————————————————–/

// nichname :fason

// autho :forbes pu(蒲佛信)

// email :fason_pfx@hotmail.com

// homepage :http://fason.nease.net

// blog :http://blog.mvpcn.net/fason/

// http://blog.csdn.net/fason/

//

// 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!\nplease 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) {

doc.readystate = 1;

doc.addeventlistener("load", function () {

doc.readystate = 4;

if (typeof doc.onreadystatechange == "function")

doc.onreadystatechange();

}, false);

}

return doc;

}

else if (window.activexobject) {

var prefix = ["msxml3","msxml2","msxml","microsoft"];

for (var i=0;i<prefix.length;i++) {

try {

var doc = new activexobject(prefix[i] +

".domdocument");

doc.setproperty("selectionlanguage","xpath");

return doc;

} catch (e) {}

}

}

return null;

};

function attachxml() {

odocument = oxml.documentelement;

if (!odocument) { throw new error(no xml data!); return; }

for (var i=0;i<asel.length-1;i++){

addevent(sel[i], "onchange", function(x) {

return function () { dochange(x); }

}(i+1));

}

dochange(0);

};

function selectxmlnode(x) {

var spath = "/*";

var odoc = odocument;

for (var i=0;i<x;i++)

spath += "/*[" + (sel[i].selectedindex+1) + "]";

if (typeof(odoc.selectsinglenode)!=undefined) return

odoc.selectsinglenode(spath);

else {

var doc=odoc.nodetype==9?odoc:odoc.ownerdocument;

var res = doc.creatensresolver(odoc.nodetype==9?

odoc.documentelement:odoc);

return doc.evaluate(spath,odoc, res, 9, null).singlenodevalue;

}

};

function addevent(el, shandler, fnc) {

if (el.attachevent) {

el.attachevent(shandler, fnc);

} else if (el.addeventlistener) {

el.addeventlistener(shandler.replace(/on/i, ), fnc, false);

} else {

el[shandler] = fnc;

}

};

function dochange(n) {

var el = selectxmlnode(n);

var nodes = el ? el.childnodes :[];

var s = sel[n];

var f = 0;

if (nodes.length>0) {

with (s){

length = 0;

for (var i = 0,j = 0;i<nodes.length;i++) {

if (nodes[i].nodetype!=1)continue;

var t = nodes[i].getattribute("text");

var v = nodes[i].getattribute("value") ? nodes

[i].getattribute("value") : t;

if (v == store[n]) f = j;

options[j++] = new option(t, v);

}

options[f].selected = true;

}

if (++n<sel.length) dochange(n);

} else {

for (var i=n; i<sel.length; i++) {

with (sel[i]) {

length = 0;

options[0] = new option(–);

options[0].selected = true;

}

}

}

};

};

//—————————–xmlselect.js文件结束——————————-

由于xml的操作简便直接,使用起来得心应手。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP + XML + JavaScript 实现动态无限级联动菜单-.NET教程,Asp.Net开发
分享到: 更多 (0)

相关推荐

  • 暂无文章