javascript - 一个选项卡上的问题,for中创建的变量显示未定义。
PHP中文网
PHP中文网 2017-04-11 10:17:54
[JavaScript讨论组]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{margin: 0;padding: 0;font-size:14px;}
        ul{list-style: none;}
        li{ float: left;margin:10px 15px 0 20px ;text-align: center;border: 1px solid #CCC;padding: 3px 5px;}
        p{width: 250px;clear: both;margin-left:20px; border: 2px solid #ccc;display: none;}
        .active{border-top-color: red}
        .
    </style>
    <script>        
window.onload=function(){
            var li=document.getElementsByTagName('li');
            var op=document.getElementsByTagName('p');
            for(var i=0;i<li.length;i++){
                
                li[i].onclick=function(){
                    for(var j=0;j<op.length;j++){
                        li[i].className='';  
                 //为什么这里的i会报错未定义,在这个onclick事件中应该能访问到函数之外的变量呀。
                        op[j].style.display='none';
                    }
                    this.className='active';
                    op[j].style.display='block'  
                    //这里的j也是一样的情况。
                }
            }
        }
    </script>
</head>
<body>
    <ul>
        <li class="active">房产</li>
        <li>家居</li>
        <li>二手房</li>
    </ul>
        <p class="active" style="display: block;">
            1
        </p>
        <p>2</p>
        <p>3</p>
</body>
</html>
PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
大家讲道理

因为你给li循环添加onclick事件之后,变量i的值已经是3了,所以li[3]是未定义的,你可以用一个闭包解决问题,或者给每个li添加个index索引值,一种方案如下

 for(var i=0;i<li.length;i++){
                li[i].index=i;//添加索引值
                li[i].onclick=function(){
                    for(var j=0;j<op.length;j++){
                        li[this.index].className='';  
                        op[j].style.display='none';
                    }//执行完for循环之后,j=3
                    this.className='active';
                    op[this.index].style.display='block'  
                }
            }
ringa_lee

script标签里面的代码改成下面就好了,这是JS闭包的问题,可以参考我之前写的博客

window.onload=function(){
    var li=document.getElementsByTagName('li');
    var op=document.getElementsByTagName('p');
    for(var i=0;i<li.length;i++){
        (function(i){
            li[i].onclick=function(){
                for(var j=0;j<op.length;j++){
                    li[i].className='';                  
                    op[j].style.display='none';    
                }
                this.className='active';
                op[i].style.display='block'  
            }    
        })(i)
        
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号