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>
原文地址:https://www.cnblogs.com/swii/p/5878731.html