使用动态JavaScript实现多级菜单联动时不刷新页面的方法

问题的提出:如下图所示,需要使用多级菜单输入地址,具体有以下要求:

(1)    当选中某一级列表项时才能出现该项对应的下一级列表供用户选择。比如在省级区域选中“湖北省”时,市级区域里边只能出现湖北省的所有市级区域供选择,当省级区域中更换成“湖南省”时,市级区域列表应该马上更新为湖南省的所有市级区域供选择。因此,这三级列表是联动的。

(2)    在选择地址的过程中不能刷新页面。刷新页面其实只是一种外观表现,就是用户感觉到页面在刷新,其实质是用户在选择多级地址的过程中需要由程序访问服务器端的数据库读取数据,重新加载页面,速度比较慢,让用户感觉页面有一个刷新的过程,比如选中省级区域为“湖北省”时需要从数据库读取湖北省所属的市级区域生成市级区域列表,这样便有一个页面刷新的过程。为了不刷新页面,就必须把数据保存在客户端,从而在更新多级列表时不需要访问服务器。


图示 使用多级列表输入地址

问题的解决:

客户端可以有两个地方保存数据,其一是在页面文件保存,将所有的地址静态编码到aspx文件中,但这样的话aspx文件会非常庞大,并且人工把这么多的地址静态编码到aspx文件当中工作量太大,同时页面静态编码无法实现多级列表联动。其二是将数据保存在JavaScript脚本,同时使用JavaScript脚本作为运行程序可以实现多级列表联动。

为了减少代码量,本系统使用了动态JavaScript,即添加一个aspx页面,用它的后台程序从数据库读取三级地址信息,动态生成JavaScript脚本,然后将它作为JavaScript文件发送到客户端。在本实例中,后台程序AreaJS.aspx.cs只有173行,而用它生成的动态JavaScript文件有4643行,大大减少了程序员的工作量。这个JavaScript被发送到客户端,可以很好地实现页面不刷新。

这种方法的巧妙在于使用aspx页面动态生成JavaScript,大幅度减少了代码量。

常用的JS后台导航菜单,可刷新不变 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml:lang="UTF-8" lang="UTF-8"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Language" content="UTF-8" /> <title>后台管理</title> <style type="text/css"> body {margin:0;text-align:center;color:#000;font:normal 12px Arial,Verdana,Tahoma;text-align:center;background:#C8D0D5;line-height:150%;} a:link,a:visited {color:#385065;text-decoration:none} a:hover {text-decoration:underline} #menu {width:150px;margin:0px 15px;padding:0px;text-align:left;list-style:none} #menu .item {margin:5px 0px;padding:0px;list-style:none} a.title:link, a.title:visited, a.title:hover {display:block;background:url(http://www.tblog.com.cn/attachments/month_0609/m20069110491.gif) no-repeat;color:#385065;font-weight:bold;padding:2px 0 0 22px;width:128px;line-height:23px;cursor:pointer;text-decoration:none} #menu .item ul {border:1px solid #9FACB7;margin:0;width:118px;padding:3px 0px 3px 30px;background:#fff;list-style:none;display:none} #menu .item ul li {display:block;} </style> [removed] // --- 获取ClassName document.getElementsByClassName = function(cl) { var retnode = []; var myclass = new RegExp('\\b'+cl+'\\b'); var elem = this.getElementsByTagName('*'); for (var j = 0; j < elem.length; j++) { var classes = elem[j].className; if (myclass.test(classes)) retnode.push(elem[j]); } return retnode; } // --- 隐藏所有 function HideAll() { var items = document.getElementsByClassName("optiton"); for (var j=0; j<items.length; j++) { items[j].style.display = "none"; } } // --- 设置cookie function setCookie(sName,sValue,expireHours) { var cookieString = sName + "=" + escape(sValue); //;判断是否设置过期间 if (expireHours>0) { var date = new Date(); date.setTime(date.getTime + expireHours * 3600 * 1000); cookieString = cookieString + "; expire=" + date.toGMTString(); } [removed] = cookieString; } //--- 获取cookie function getCookie(sName) { var aCookie = [removed].split("; "); for (var j=0; j < aCookie.length; j++){ var aCrumb = aCookie[j].split("="); if (escape(sName) == aCrumb[0]) return unescape(aCrumb[1]); } return null; } window { var show_item = "opt_1"; if (getCookie("show_item") != null) { show_item= "opt_" + getCookie("show_item"); } document.getElementById(show_item).style.display = "block"; var items = document.getElementsByClassName("title"); for (var j=0; j<items.length; j++) { items[j] { var o = document.getElementById("opt_" + this.name); if (o.style.display != "block") { HideAll(); o.style.display = "block"; setCookie("show_item",this.name); } else { o.style.display = "none"; } } } } [removed] </head> <body> <ul id="menu"> <li class="item"><a href="[removed]void(0)" class="title" name="1">基本信息</a> <ul id="opt_1" class="optiton"> <li><a href="#">企业简介</a></li> <li><a href="#">企业新闻</a></li> </ul> </li> <li class="item"><a href="[removed]void(0)" class="title" name="2">系统管理</a> <ul id="opt_2" class="optiton"> <li><a href="#">企业简介</a></li> <li><a href="#">企业新闻</a></li> </ul> </li> <li class="item"><a href="[removed]void(0)" class="title" name="3">系统管理</a> <ul id="opt_3" class="optiton"> <li><a href="#">会员管理</a></li> <li><a href="#">管理员设置</a></li> <li><a href="#">权限组设置</a></li> <li><a href="#">退出系统</a></li> </ul> </li> </ul> </body> </html> <a href="http://js.alixixi.com/">欢迎访问阿里西西网页特效代码站,js.alixixi.com</a>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值