为了账号安全,请及时绑定邮箱和手机立即绑定

正在回答

1 回答

不是。是你id的问题,注意到使用了一个for循环为每个p绑定了点击事件,在for循环结束后,每个p标签已经绑定了事件了。但是注意到你的i在内存中的值已经是3了,所以你每次都没有效果,可以在每个节点上绑定一些数据。帮你修改了一个。可以参照一下,测试过了是可以的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>层叠下拉菜单</title>
    <style type="text/css">
 *{
            margin:0;padding: 0;font-size: 20px;list-style: none;text-decoration: none;color: black;
 }
        .menu{
            width: 210px;margin:50px auto;border: 1px solid #ccc;
 }
        .menu p{height: 25px;line-height: 25px;font-weight: bold;background: :#eee;border-bottom: 1px solid #ccc;cursor: pointer;padding-left: 5px;background: #eee;}
        ul{display: none;}
        .menu li{height: 24px;line-height: 24px;padding-left: 5px;}
    </style>
    <script type="text/javascript">
 window.onload=function(){
            var p=document.getElementById('menu').getElementsByTagName('p');
 var ul=document.getElementById("menu").getElementsByTagName("ul");
 for (var i = 0; i < p.length; i++) {
                p[i].id = i;
 p[i].onclick=function(){
                    for (var j = 0; j < ul.length; j++) {
                        if (j==this.id) {
                            ul[j].style.display='block';
 }
                        else{
                            ul[j].style.display = "none";
 }
                    }
                }
            }
        }
    </script>
</head>
<body>
<div class="menu"  id="menu">
    <div>
        <p>Web前端</p>
        <ul>
            <li><a href="#"> JavaScript</a></li>
            <li>Div+Css</li>
            <li><a href="#">jQuery</a></li>
        </ul>
    </div>
    <div>
        <p>后台脚本</p>
        <ul>
            <li><a href="#">PHP</a></li>
            <li>ASP .net</li>
            <li><a href="#">JSP</a></li>
        </ul>
    </div>
    <div>
        <p>前端框架</p>
        <ul>
            <li><a href="#">Extjs</a></li>
            <li>Esspress</li>
            <li><a href="#">YUI</a></li>
        </ul>
    </div>
</div>
</body>
</html>

在每个节点上绑定了id,这样就可以正确的得到了索引。

1 回复 有任何疑惑可以回复我~
#1

qq_慕斯卡4334448 提问者

大神 测试确实可以通过 但两个循环为什么不能直接对等,还要用P[i].id ,在下小白 理解有点吃力 我该注意什么
2016-12-13 回复 有任何疑惑可以回复我~
#2

串猪神 回复 qq_慕斯卡4334448 提问者

因为注意到p[i]只是引用了数组里的某个变量而已,通过for循环后i值是已经改变了,你通过onclick监听点击事件是没办法直接读取到这是第几个i的,一般都会通过在节点上进行标记。其实就是i的值变化的问题,你可以在onclick里面console.log(i);你看下就知道了,每次打印出来的都是3,因为for循环结束的时候监听事件设置完,i的值在内存中变化成3了。所以其实就相当于你的每次点击i都是3、
2016-12-13 回复 有任何疑惑可以回复我~
#3

qq_慕斯卡4334448 提问者 回复 串猪神

明白,那在节点上只是进行标记的话 id 也是可以换成其他的喽,一直让我想到body中的标签···
2016-12-13 回复 有任何疑惑可以回复我~
#4

串猪神 回复 qq_慕斯卡4334448 提问者

是的,可以换成其他属性,像很多框架都会自定义一个属性在上面,比如data-xxx-xxx = 'xxx'这样子来做标记,即支持了h5,也可以对节点做判断,也不会干扰到其他节点
2016-12-13 回复 有任何疑惑可以回复我~
#5

qq_慕斯卡4334448 提问者 回复 串猪神

感谢回答与回复!
2016-12-13 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消

求解​是循环的问题吗

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信