我在这里: 首页 » 程序人生 » 浏览文章: Javascript抽屉效果,以及js获取当前元素在父容器中的顺序
« 有趣的小知识,可以拿来炫耀偏头痛介绍,诱因和一些调理办法。 »

Javascript抽屉效果,以及js获取当前元素在父容器中的顺序

朋友的项目正好需要一个抽屉效果的js代码,现写了一段,主要是通过判断所需要的收缩/展开的样式,控制display样式的值。调用方法为"switchState(this, i);i为当前menu的顺序;后来又一次改进的方法是自动获取i(当前元素在父容器的顺序)。

代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style type="text/css">
<!--
* { margin:0; padding:0; font-size:12px; font-weight:normal; }
#drawer { position:relative; width:200px; margin:50px; border:solid #ccc; border-width:0 1px 1px; }
#drawer h4 { height:18px; line-height:18px; border:solid #ccc; border-width:1px 0; margin-bottom:-1px; text-align:center; background:#f6f6f6; cursor:pointer; }

li {list-style-type:none;}
#links_ {margin:-20px 0 0 50px; color:blue; cursor:pointer; text-decoration:underline;}

/* required, other css lines are optional*/
.drawerS_ { display:block; }
.drawerS { display:none; }
-->
</style>
  <script type="text/javascript">
  //global param
  var showStyleName = "drawerS_";
  var hideStyleName = "drawerS";

  function showAll(hide)
  {
    var allOl = document.getElementById("drawer").getElementsByTagName('ol');
  var targetClass = hideStyleName;
  if(!hide)
  targetClass = showStyleName;

  for(var i = 0;i < allOl.length;i++) 
  {
    allOl[i].className = targetClass;
  }
  }

  function switchState(obj, i)
  {
  var selmenu = obj.parentNode.getElementsByTagName('ol')[i];
  if(selmenu.className == hideStyleName)
    selmenu.className = showStyleName
  else
    selmenu.className=hideStyleName;
  }
  </script>
 </HEAD>

 <BODY>
<div id="drawer">
  <h4 onclick="switchState(this, 0);">Menu 1</h4>
    <ol>
      <li>Sub Menu 1</li>
      <li>Sub Menu 1</li>
    </ol>
  <h4 onclick="switchState(this, 1);">Menu 2</h4>
    <ol>
      <li>Sub Menu 2</li>
      <li>Sub Menu 2</li>
    </ol>
  <h4 onclick="switchState(this, 2);">Menu 3</h4>
    <ol>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
    </ol>
  <h4 onclick="switchState(this, 3);">Menu 4</h4>
    <ol>
      <li>Sub Menu 4</li>
      <li>Sub Menu 4</li>
      <li>Sub Menu 4</li>
    </ol>
</div>
<div id="links_"><a onclick="showAll();">Expand All</a> / <a onclick="showAll('^_^');">Hide All</a></div>
<script language="JavaScript">showAll("*o*");</script>
 </BODY>
</HTML>


基本上达到了所需要的抽屉效果,但是在调用的时候,每次都要通过指定需要展开的sub menu的index,查阅了一些资料,发现可以通过event来获取当前event的target,进而获得一些自己需要的信息,我需要target的所有同级别的html元素集合(通过“target.爸.儿子”来实现)、target在同级别元素集合中的index。修改后的代码为:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style type="text/css">
<!--
* { margin:0; padding:0; font-size:12px; font-weight:normal; }
#drawer { position:relative; width:200px; margin:50px; border:solid #ccc; border-width:0 1px 1px; }
#drawer h4 { height:18px; line-height:18px; border:solid #ccc; border-width:1px 0; margin-bottom:-1px; text-align:center; background:#f6f6f6; cursor:pointer; }

li {list-style-type:none;}
#links_ {margin:-20px 0 0 50px; color:blue; cursor:pointer; text-decoration:underline;}

/* required, other css lines are optional*/
.drawerS_ { display:block; }
.drawerS { display:none; }
-->
</style>
  <script type="text/javascript">
  //global param
  var showStyleName = "drawerS_";
  var hideStyleName = "drawerS";

  function showAll(hide)
  {
    var allOl = document.getElementById("drawer").getElementsByTagName('ol');
  var targetClass = hideStyleName;
  if(!hide)
  targetClass = showStyleName;

  for(var i = 0;i < allOl.length;i++) 
  {
    allOl[i].className = targetClass;
  }
  }

  function switchState(e)
  {
  e = window.event || e;
  var targetObj = e.target || e.srcElement;
  var collectionMenus = targetObj.parentNode.getElementsByTagName('h4');
  var i= 0;
  while(collectionMenus[i]){
    tem = collectionMenus[i++];
    if(tem == targetObj) break;
  }

  var selmenu = targetObj.parentNode.getElementsByTagName('ol')[i-1];
  if(selmenu.className == hideStyleName)
    selmenu.className = showStyleName
  else
    selmenu.className=hideStyleName;
  }
  </script>
 </HEAD>

 <BODY>
<div id="drawer">
  <h4 onclick="switchState();">Menu 1</h4>
    <ol>
      <li>Sub Menu 1</li>
      <li>Sub Menu 1</li>
    </ol>
  <h4 onclick="switchState();">Menu 2</h4>
    <ol>
      <li>Sub Menu 2</li>
      <li>Sub Menu 2</li>
    </ol>
  <h4 onclick="switchState();">Menu 3</h4>
    <ol>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
    </ol>
  <h4 onclick="switchState();">Menu 4</h4>
    <ol>
      <li>Sub Menu 4</li>
      <li>Sub Menu 4</li>
      <li>Sub Menu 4</li>
    </ol>
</div>
<div id="links_"><a onclick="showAll();">Expand All</a> / <a onclick="showAll('^_^');">Hide All</a></div>
<script language="JavaScript">showAll("*o*");</script>
 </BODY>
</HTML>


在event的处理上,firefox跟IE有一定的差别,修改一下调用方法来解决这个兼容性问题:

<div id="drawer">
  <h4 onclick="switchState(event);">Menu 1</h4>
    <ol>
      <li>Sub Menu 1</li>
      <li>Sub Menu 1</li>
    </ol>
  <h4 onclick="switchState(event);">Menu 2</h4>
    <ol>
      <li>Sub Menu 2</li>
      <li>Sub Menu 2</li>
    </ol>
  <h4 onclick="switchState(event);">Menu 3</h4>
    <ol>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
      <li>Sub Menu 3</li>
    </ol>
     ....


参考文章:
http://www.webdeveloper.com/forum/showthread.php?t=177063
http://dudu.cnblogs.com/archive/2005/02/17/105400.html

发表评论

为了防止SPAM,含链接的评论需要审核后才能显示。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

支持我们

最新评论及回复

最近发表

Search