Tag Archives: Javascript

程序人生

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 = targetO
bj.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

程序人生

javascript连接数据库并读取数据

<html>
<head>
    
        
<title>JS</title>

<script language="javascript"> 
      
var conn = new ActiveXObject("ADODB.Connection"); 
      conn.Open(
"Provider=SQLOLEDB.1; Data Source=.; User ID=sa; Password=sa; Initial Catalog=test"); 
      
var rs = new ActiveXObject("ADODB.Recordset"); 
      
var sql="select * from userinfo"
      rs.open(sql, conn); 
     shtml 
= "<table width=’100%’ border=1>"
     shtml 
+="<tr bgcolor=’#f4f4f4′><td>姓名</td><td>性别</td><td>年龄</td><td>电话</td><td> 地址</td></tr>"
      
while(!rs.EOF) 
     

     shtml 
+= "<tr><td>" + rs("uname"+ "</td><td>" + rs("sex"+ "</td><td>" + rs("age"+ "</td><td>" + rs("tel"+ "</td><td>" + rs("addr"+ "</td></tr>"
     rs.moveNext; 
  
    }
 
      shtml 
+= "</table>"
      document.write(shtml); 
      rs.close();  
      rs 
= null;  
      conn.close();  
      conn 
= null
</script> 

</head>
    
<body >
    
</body>
</html>

程序人生

Javascript: event.keyCode介绍与应用

<html>
<head>
<script language="javascript">
    ns4 = (document.layers) ? true : false;
    ie4 = (document.all) ? true : false;
    function keyDown(e)
    {
        if(ns4){
        var nkey=e.which;
        var iekey=’现在是ns浏览器’;
        var realkey=String.fromCharCode(e.which);
        }
        if(ie4){
        var iekey=event.keyCode;
        var nkey=’现在是ie浏览器’;
        var realkey=String.fromCharCode(event.keyCode);
        if(event.keyCode==32){realkey=’\’ 空格\”}
        if(event.keyCode==13){realkey=’\’ 回车\”}
        if(event.keyCode==27){realkey=’\’ Esc\”}
        if(event.keyCode==16){realkey=’\’ Shift\”}
        if(event.keyCode==17){realkey=’\’ Ctrl\”}
        if(event.keyCode==18){realkey=’\’ Alt\”}
        }
        alert(‘ns浏览器中键值:’+nkey+’\n’+'ie浏览器中键值:’+iekey+’\n’+'实际键为’+realkey);
    }
    document.onkeydown = keyDown;
    if(ns4)
    {
        document.captureEvents(Event.KEYDOWN);
    }
</script>
</head>
<body>
//window.event.keyCode
<hr>
<center>
<h3>请按任意一个键。。。。</h3>
</center>
</body>
</html>

运行以上代码可以读取所需要的keyCode。

在实际运用中,keyCode可以捕获用户的键盘输入,通过判断进行相应的操作。
eg:
onkeydown="if (event.keyCode == 13) 操作"

if(event.keyCode==13)alert(“enter!”);

键值对应表
A  0X65  U   0X85
B  0X66  V   0X86
C  0X67  W   0X87
D  0X68  X   0X88
E  0X69  Y   0X89
F  0X70  Z   0X90
G  0X71  0   0X48
H  0X72  1   0X49
I  0X73  2   0X50
J  0X74  3   0X51
K  0X75  4   0X52
L  0X76  5   0X53
M  0X77  6   0X54
N  0X78  7   0X55
O  0X79  8   0X56
P  0X80  9   0X57
Q  0X81 ESC  0X1B
R  0X82 CTRL  0X11
S  0X83 SHIFT 0X10
T  0X84 ENTER 0XD


如果要使用组合键,则可以利用event.ctrlKey,event.shiftKey,event .altKey判断是否按下了ctrl键、shift键以及alt键