<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>刘钢的博客 - 我是UED &#187; 菜单</title>
	<atom:link href="http://www.iamued.com/tag/%e8%8f%9c%e5%8d%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[原创]用JS控制显示子菜单个数 自动下拉</title>
		<link>http://www.iamued.com/qianduan/1010.html</link>
		<comments>http://www.iamued.com/qianduan/1010.html#comments</comments>
		<pubDate>Fri, 25 Dec 2009 13:21:15 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[菜单]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1010</guid>
		<description><![CDATA[今天得到产品经理的一个需求 分类体系 一级分类 以及其子分类 在一个标题栏上展示 只显示5个子分类 其余显示为下拉列表 效果如下图 由于对前端比较痴迷 于是乎用前端来实现了一下 之前这样的需求 都是程序员去做判断 来实现的 查看DEMO 下载代码 已在如下浏览器测试 IE6 IE7 IE8 FF3.5.6 Opera10 Safari4 页面结构用前端实现如下 可以看到 对于程序输出来讲 这样的结构不需要任何逻辑 相对代码结构清晰整洁 核心JS代码如下 这里要解释一个地方 这里为什么要i&#8211;呢 由于读取出来的是一个引用对象 所以将之前数组内对象 添加到新的 对象里 之前的数组length将-1 所以将i&#8211;以获得之前数组的连贯对象 在代码中用到了2个之前收集的方法 主要是为了兼容各种浏览器 其他的更多的是页面样式的问题 不做过多解释了 查看DEMO 下载代码 转载请注明：转自我是UED-原文链接:http://www.iamued.com/qianduan/1010.html]]></description>
			<content:encoded><![CDATA[<p>今天得到产品经理的一个需求<br />
分类体系 一级分类 以及其子分类 在一个标题栏上展示 只显示5个子分类 其余显示为下拉列表 效果如下图<br />
<img class="alignnone size-full wp-image-1011" title="submenumore" src="http://iamued-wordpress.stor.sinaapp.com/uploads/2009/12/submenumore1.gif" alt="submenumore" width="602" height="131" /><br />
由于对前端比较痴迷 于是乎用前端来实现了一下 之前这样的需求 都是程序员去做判断 来实现的<br />
<strong><a href="http://www.iamued.com/demo/submenumore/index.html">查看DEMO</a></strong><br />
<strong><a href="http://www.iamued.com/demo/submenumore/submenumore-iamued.rar">下载代码</a></strong><br />
已在如下浏览器测试 IE6 IE7 IE8 FF3.5.6 Opera10 Safari4<br />
页面结构用前端实现如下</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;Area&quot;&gt;
  &lt;div id=&quot;menu1&quot; class=&quot;main_tit&quot;&gt;
	&lt;h2&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;IamUed.com-前端开发&lt;/a&gt;&lt;/h2&gt;
	&lt;ul  class=&quot;sublist&quot;&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;javascript&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Ria&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;ActionScript&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Flash&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Flex&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;W3C&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;xhtml&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
  &lt;/div&gt;
  一级内具体内容
&lt;/div&gt;
</pre>
<p>可以看到 对于程序输出来讲 这样的结构不需要任何逻辑 相对代码结构清晰整洁</p>
<p>核心JS代码如下<br />
<span id="more-1010"></span></p>
<pre class="brush: jscript; title: ; notranslate">
//核心方法 传送一个数组参数
function submenumore(menuarr)
{
    for(var j=0;j&lt;menuarr.length;j++)//循环该数组
    {
        var listli=document.getElementById(menuarr[j]).getElementsByTagName(&quot;ul&quot;)[0].getElementsByTagName(&quot;li&quot;);//根据数组获取到该子菜单的li
        if(listli.length &gt; 5)//如果子菜单数量大于5
        {
            var newimg=document.createElement(&quot;a&quot;);//新建一个a元素 作为大于5个之后显示的小图标容器
            newimg.className=&quot;moreimg&quot;;//给a元素设置一个样式
            newimg.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释
            {
                showsubmore(this);
            }
            newimg.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释
            {
                hidesubmore(this);
            }
            var newul=document.createElement(&quot;ul&quot;);//新建一个Ul元素 用来存档多余的子菜单
            newul.className=&quot;sublistmore&quot;;//给新的UL设置样式
            for(var i=5;i&lt;listli.length;i++)
            {
                newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里
                i--;
            }
            newul.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释
            {
                this.style.display=&quot;block&quot;
            }
            newul.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释
            {
                this.style.display=&quot;none&quot;
            }
            var imgli=document.createElement(&quot;li&quot;);//新建一个li元素
            imgli.appendChild(newimg);//将之前建立的A元素 添加到这里 为了页面结构统一 可以比较好的调整样式
            document.getElementById(menuarr[j]).getElementsByTagName(&quot;ul&quot;)[0].insertBefore(imgli,null);//将新建的LI插入到5个子菜单后面
            document.getElementById(menuarr[j]).appendChild(newul);//将多余子菜单加入到数组所传的容器内
        }
    }
}
</pre>
<p>这里要解释一个地方</p>
<pre class="brush: jscript; title: ; notranslate">
 for(var i=5;i&lt;listli.length;i++)
  {
     newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里
     i--;
  }
</pre>
<blockquote><p>
这里为什么要i&#8211;呢<br />
由于读取出来的是一个引用对象<br />
所以将之前数组内对象 添加到新的 对象里<br />
之前的数组length将-1<br />
所以将i&#8211;以获得之前数组的连贯对象
</p></blockquote>
<p>在代码中用到了2个之前收集的方法 主要是为了兼容各种浏览器</p>
<pre class="brush: jscript; title: ; notranslate">
//该函数主要取得对象距离浏览器的真实距离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;
}
</pre>
<p>其他的更多的是页面样式的问题 不做过多解释了</p>
<p><strong><a href="http://www.iamued.com/demo/submenumore/index.html">查看DEMO</a></strong><br />
<strong><a href="http://www.iamued.com/demo/submenumore/submenumore-iamued.rar">下载代码</a></strong><br />
转载请注明：转自我是UED-原文链接:http://www.iamued.com/qianduan/1010.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1010.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

