首页 > 代码库 > display=""的悲剧
display=""的悲剧
在学习tab选项卡的时候,要做到点击标题时判断该标题下的菜单是否显示,如果是显示的则将其隐藏,如果是隐藏的则将其显示出来。
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style type="text/css"> 7 *{margin:0; 8 padding:0; 9 font-size:13px;10 list-style:none;}11 12 .menu{width:210px;13 margin:50px auto;14 border:1px solid #ccc;}15 16 .menu p{height:25px;17 line-height:25px;18 font-weight:bold;19 background:#eee;20 border-bottom:1px solid #ccc;21 cursor:pointer;22 padding-left:5px;}23 24 .menu div ul{display:none;}25 26 .menu li{height:24px;27 line-height:24px;28 padding-left:5px;}29 </style>30 31 </head>32 <body>33 <div class="menu" id="menu">34 <div>35 <p>Web前端</p>36 <ul style="display:block">37 <li>JavaScript</li>38 <li>DIV+CSS</li>39 <li>jQuery</li>40 </ul>41 </div>42 <div>43 <p>后台脚本</p>44 <ul>45 <li>PHP</li>46 <li>ASP.net</li>47 <li>JSP</li>48 </ul>49 </div>50 <div>51 <p>前端框架</p>52 <ul>53 <li>Extjs</li>54 <li>Esspress</li>55 <li>YUI</li>56 </ul>57 </div>58 </div>59 <script type="text/javascript">60 function fun(str) {61 62 return typeof str===‘string‘?document.getElementById(str):str;63 }64 65 var ps=fun("menu").getElementsByTagName("p");66 for (var i = ps.length - 1; i >= 0; i--) { 67 ps[i].onclick=function(){68 69 if(this.nextSibling.style.display=="none"){70 this.nextSibling.style.display="block"; 71 }72 else{73 this.nextSibling.style.display="none";74 }75 }76 }77 </script>78 </body>79 </html>
注意:1)script放在后面是因为,在html文本加载完后,才取得到id为menu的节点,如果不放在后面,放在window.onload里面也可以。
2)p标签后紧跟ul标签是因为,如果不这样,中间就会产生文本节点,p标签的下一个节点也就不是ul标签了
但是我发现,除了第一个ul在第一次点击ul的时候可以成功,其他两个ul在首次伸缩时需要经过两次,本人初涉javascript,研究了半天chrome如何调试断点后发现
在判断ul的display是否为none的时候,明明“后台脚本”和“前端框架”这两个块都是隐藏的,但是在第一次点击时跳到了else{this.nextSibling.style.display="none"};然后在第二次点击的时候判断才为true,转到了设置display为block的那一步,所以在首次伸缩时需要点击两次。那么为什么隐藏的块第一次判定条件的时候会显示false呢?
结果反反复复调试后发现,第一次点击时,this.nextSibling.style.display="",所以判断为false,那么“”是什么值,明明在css中设定display:none,并且也的确没有显示,为什么会变成“”
因为WEB前端只需点击一次就可成功,我就把目光移到了这两个的区别上,后来我发现,因为WEB前端在ul标签中设定了display=“block”,覆盖了原有的值,所以其他的ul标签会生成一个display=“”的内联式css与“WEB前端”的内联式相对于,而display=“”的意思即为保持原有值不变,则还是display:none。所以为了解决这个问题,有两种方法:
1、修改判断语句为:
1 var dis=this.nextSibling.style.display;2 3 if(dis=="none"||dis==""){4 this.nextSibling.style.display="block"; 5 }6 else{7 this.nextSibling.style.display="none";8 }
2:在其他两个ul的标签中也增加内联式css即:
1 <p>后台脚本</p><ul style="display:none">2 <li>PHP</li>3 <li>ASP.net</li>4 <li>JSP</li>5 </ul>
display=""的悲剧