论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Javascript教程
Tag:验证,特效,入门,实例,验证,表单,特效,正则表达式,跑马灯,document,函数,代码,getElementByID,菜单,图片,视频教程

用JS控制显示子菜单个数 自动下拉

文章类别:Javascript | 发表日期:2010-1-26 13:48:43

页面结构用前端实现如下
代码:
<div class="Area">
  <div id="menu1" class="main_tit">
    <h2><a href="http://www.iamued.com">IamUed.com-前端开发</a></h2>
    <ul  class="sublist">
        <li><a href="http://www.iamued.com">javascript</a></li>
        <li><a href="http://www.iamued.com">Ria</a></li>
        <li><a href="http://www.iamued.com">ActionScript</a></li>
        <li><a href="http://www.iamued.com">Flash</a></li>
        <li><a href="http://www.iamued.com">FLex</a></li>
        <li><a href="http://www.iamued.com">W3C</a></li>
        <li><a href="http://www.iamued.com">xhtml</a></li>
    </ul>
  </div>
  一级内具体内容
</div>
可以看到 对于程序输出来讲 这样的结构不需要任何逻辑 相对代码结构清晰整洁
核心JS代码如下
复制内容到剪贴板代码:
//核心方法 传送一个数组参数 
function submenumore(menuarr) 

    for(var j=0;j<menuarr.length;j++)//循环该数组
    { 
        var listli=document.getElementById(menuarr[j]).getElementsByTagName("ul")[0].getElementsByTagName("li");//根据数组获取到该子菜单的li 
        if(listli.length > 5)//如果子菜单数量大于5 
        { 
            var newimg=document.createElement("a");//新建一个a元素 作为大于5个之后显示的小图标容器 
            newimg.className="moreimg";//给a元素设置一个样式 
            newimg.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释 
            { 
                showsubmore(this); 
            } 
            newimg.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释 
            { 
                hidesubmore(this); 
            } 
            var newul=document.createElement("ul");//新建一个Ul元素 用来存档多余的子菜单 
            newul.className="sublistmore";//给新的UL设置样式 
            for(var i=5;i
            { 
                newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里 
                i--; 
            } 
            newul.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释 
            { 
                this.style.display="block"
            } 
            newul.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释 
            { 
                this.style.display="none"
            } 
            var imgli=document.createElement("li");//新建一个li元素 
            imgli.appendChild(newimg);//将之前建立的A元素 添加到这里 为了页面结构统一 可以比较好的调整样式 
            document.getElementById(menuarr[j]).getElementsByTagName("ul")[0].insertBefore(imgli,null);//将新建的LI插入到5个子菜单后面 
            document.getElementById(menuarr[j]).appendChild(newul);//将多余子菜单加入到数组所传的容器内 
        } 
    } 
}
这里要解释一个地方
复制内容到剪贴板代码:
for(var i=5;i<listli.length;i++) 

    newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里 
    i--; 
}
这里为什么要i–呢
由于读取出来的是一个引用对象
所以将之前数组内对象 添加到新的 对象里
之前的数组length将-1
所以将i–以获得之前数组的连贯对象
在代码中用到了2个之前收集的方法 主要是为了兼容各种浏览器
复制内容到剪贴板代码:
//该函数主要取得对象距离浏览器的真实距离Offset 
function GetRealOffset(o) 

    var elem = o; 
    var leftOffset = elem.offsetLeft; 
    var topOffset = elem.offsetTop; 
    var parent = elem.offsetParent; 
    while(parent) 
    { 
        leftOffset += parent.offsetLeft; 
        topOffset += parent.offsetTop; 
        parent = parent.offsetParent; 
    } 
    var Offsets = new Object(); 
    Offsets.top = topOffset; 
    Offsets.left = leftOffset; 
    return Offsets; 

//该函数主要用于取得元素的兄弟节点 由于火狐下兄弟节点将TextNode也计算在内 所以用该函数兼容 
function getnextSibling(o) 

    do
    { 
        o = o.nextSibling; 
    } 
    while (o.nodeType != 1) 
    return o; 
}
其他的更多的是页面样式的问题 不做过多解释了
视频教程列表
文章教程搜索
 
Javascript推荐教程
Javascript热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058