本文提供基于JavaScript和CSS实现可折叠二级菜单的完整代码示例。重点解析HTML结构、CSS样式定义及JS交互逻辑,并详细说明解决DOM加载顺序问题的两种方案:window.onload延迟加载与脚本置于页面底部。
可折叠二级菜单实现概述
本文展示了一个使用JavaScript和CSS构建的可折叠二级菜单实例,供读者参考学习。
以下是.aspx页面文件的代码实现。
.aspx页面结构代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="NavigateMenu.aspx.cs" Inherits="NavigateMenu" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript" src="JScript.js" ></script>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
border:0px;
}
#nav{
width: 200px;
margin: 0px;
padding: 0px;
font-size: 14px;
line-height: 30px;
}
#nav li{
width: 180px;
padding-left: 20px;
padding-bottom: 1px;
list-style-image: none;
list-style-type: none;
background-color: #FFFFFF;
float: left;
}
#nav a{
padding-left: 20px;
background-color: #BFBFBF;
display: block;
text-decoration: none;
}
#nav a:hover {
background-color: #FF9175;
}
#nav li ul{
padding-top: 1px;
list-style-image: none;
list-style-type: none;
}
#nav li li{
padding-left: 0px;
}
#nav ul a{
background-color: #EBEBEB;
}
.cx {
display:none;
visibility:hidden;
}
.ex {
display:inherit;
visibility:inherit;
}
</style>
<script type="text/javascript" >
window.onload=function()
{
statUp();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="Parent">
<ul id="nav">
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单1</a>
<ul>
<li><a href="javascript:void(0);">菜单1_1</a></li>
<li><a href="javascript:void(0);">菜单1_2</a></li>
</ul>
</li>
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单2</a>
<ul>
<li><a href="javascript:void(0);">菜单2_1</a></li>
<li><a href="javascript:void(0);">菜单2_2</a></li>
</ul>
</li>
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单3</a>
<ul>
<li><a href="javascript:void(0);">菜单3_1</a></li>
<li><a href="javascript:void(0);">菜单3_2</a></li>
</ul>
</li>
</ul>
</div>
</form>
</body>
</html>
以下是JavaScript脚本文件的代码实现。
JavaScript交互逻辑代码
function doMenu(obj){
var items=obj.parentNode.getElementsByTagName("ul");
var itmUl;
if(items.length>0){
itmUl=items[0];
}
if(itmUl.className!="ex"){
cxAll();
itmUl.className="ex";
}else{
itmUl.className="cx";
}
}
function statUp(){
cxAll();
}
function cxAll(){
var ulDom=document.getElementById("nav");
var items=ulDom.getElementsByTagName("ul");
for (var i=0;i<items.length;i++)
{
items[i].className="cx";
}
}
DOM加载与延迟加载处理方案
需要特别注意延迟加载的问题。当JS代码单独存放于文件或者嵌入在<head>节点中时,页面加载过程中会执行预处理方法statUp()。此时必须使用window.onload=function(){执行语句;}进行延迟加载,否则在引用DOM对象时可能会触发“缺少对象”的错误提示。
另一种解决方法是将所有JavaScript代码直接写在</html>标签之前。
HTML与JS整合示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>菜单</title>
<script type="text/javascript" src="Untitled-3.js"></script>
<style>
*{
margin: 0px;
padding: 0px;
border:0px;
}
#nav{
width: 200px;
margin: 0px;
padding: 0px;
font-size: 14px;
line-height: 30px;
}
#nav li{
width: 180px;
padding-left: 20px;
padding-bottom: 1px;
list-style-image: none;
list-style-type: none;
background-color: #FFFFFF;
float: left;
}
#nav a{
padding-left: 20px;
background-color: #BFBFBF;
display: block;
text-decoration: none;
}
#nav a:hover {
background-color: #FF9175;
}
#nav li ul{
padding-top: 1px;
list-style-image: none;
list-style-type: none;
}
#nav li li{
padding-left: 0px;
}
#nav ul a{
background-color: #EBEBEB;
}
.cx {
display:none;
visibility:hidden;
}
.ex {
display:inherit;
visibility:inherit;
}
</style>
</head>
<body>
<div id="Parent">
<ul id="nav">
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单1</a>
<ul>
<li><a href="javascript:void(0);">菜单1_1</a></li>
<li><a href="javascript:void(0);">菜单1_2</a></li>
</ul>
</li>
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单2</a>
<ul>
<li><a href="javascript:void(0);">菜单2_1</a></li>
<li><a href="javascript:void(0);">菜单2_2</a></li>
</ul>
</li>
<li><a href="javascript:void(0);" onclick="doMenu(this)">菜单3</a>
<ul>
<li><a href="javascript:void(0);">菜单3_1</a></li>
<li><a href="javascript:void(0);">菜单3_2</a></li>
</ul>
</li>
</ul>
</div>
</body>
</html>
<script type="text/javascript">
function doMenu(obj){
var items=obj.parentNode.getElementsByTagName("ul");
var itmUl;
if(items.length>0){
itmUl=items[0];
}
if(itmUl.className!="ex"){
cxAll();
itmUl.className="ex";
}else{
itmUl.className="cx";
}
}
function statUp(){
cxAll();
//var ulDom=document.getElementById("nav");
//var items=ulDom.getElementsByTagName("ul");
}
function cxAll(){
var ulDom=document.getElementById("nav");
var items=ulDom.getElementsByTagName("ul");
for (var i=0;i<items.length;i++)
{
items[i].className="cx";
}
}
statUp();
</script>
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。