js为什么会报错Uncaught TypeError: Cannot read property 'style' of undefined

functionctrlSlider(){varctrl=document.getElementById("control");varctrlli=ctrl.getEle... function ctrlSlider(){
var ctrl = document.getElementById("control");
var ctrlli = ctrl.getElementsByTagName("li");
var mdiv = document.getElementById("content");
var mli = mdiv.getElementsByTagName("li");
for (var i=0; i<ctrlli.length; i++){
ctrlli[i].onclick = function(){
for(var j = 0; j<mli.length; j++){mli[j].style.opacity = 0;}
mli[i].style.opacity = 1;
}
}
}

html

<div id="mid">
<div id="content">
<ul>
<li id="start" ><img src="../11.26(2)/img/one.png"/ ></li>
<li class="none"><img src="../11.26(2)/img/two.png"/ ></li>
<li class="none"><img src="../11.26(2)/img/three.png"/ ></li>
<li class="none"><img src="../11.26(2)/img/four.png"/ ></li>
</ul>
</div>
<div id="control">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
</div>
展开
 我来答
催斯特2020
2018-11-08
知道答主
回答量:1
采纳率:0%
帮助的人:806
展开全部

ctrlSlider函数里面定义的变量i是var命令声明的,在该函数内都有效,所以函数内只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给ctrlli[i]的参数i,里面的i指向的就是全局的i。也就是说,每一次for循环里面的i,指向的都是同一个i。可以尝试在ctrlli[i].onclick = function(){这行下面输出i值:console.log(i),打印的都是4。如果使用let,声明的变量仅在块级作用域内有效,依次点击下面的列表会分别输出0,1,2,3。

根闹米
推荐于2019-09-19 · TA获得超过1万个赞
知道答主
回答量:76
采纳率:0%
帮助的人:2.1万
展开全部

原因:

在columns里加入了id,并设置visible:false ,却未在HTML多加一个th 。
它们必须数目一样。

解决方案:

如图添加th

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0dd248dc
推荐于2017-11-17 · TA获得超过249个赞
知道小有建树答主
回答量:136
采纳率:0%
帮助的人:127万
展开全部
function ctrlSlider(){
    var ctrl = document.getElementById("control");
    var ctrlli = ctrl.getElementsByTagName("li");
    var mdiv = document.getElementById("content");
    var mli = mdiv.getElementsByTagName("li");
    for (var i=0; i<ctrlli.length; i++){
        !function(k){
            ctrlli[k].onclick = function(){
                for(var j = 0; j<mli.length; j++)mli[j].style.opacity = 0;
                mli[k].style.opacity = 1;
            }
        }(i)
    }
}
ctrlSlider()

i在事件触发的时候已经是4了,mli[i]就成了undefined,undefined当然就没有style属性。

可以使用闭包来实现。

追问
我不是规定了 i<ctrlli.length  了吗?为什么i在触发时会是4呢?
追答
i自增到3,满足for循环条件,所以继续循环,当i自增到4,for循环停止。
但是i此时已经是4了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
低调光环
推荐于2017-12-25 · TA获得超过307个赞
知道小有建树答主
回答量:169
采纳率:100%
帮助的人:107万
展开全部
 for (var i=0; i<ctrlli.length; i++){
   ctrlli[i].onclick = function(){
       for(var j = 0; j<mli.length; j++){
           mli[j].style.opacity = 0;
       } 
       mli[i].style.opacity = 1;//这个执行的时候i==ctrlli.length
       }
   }

改为

for (var m=0; m<ctrlli.length; m++){
    (function(i){
        ctrlli[i].onclick = function(){
           for(var j = 0; j<mli.length; j++){
               mli[j].style.opacity = 0;
           } 
           mli[i].style.opacity = 1;//这个执行的时候i==m
           }
    })(m)
}
追问
上面的兄弟比您快点 都正确的解答了 不好意思啊
追答
没事,随手答的..
不过这种异步回调获取for循环的问题隔一段时间就有新手问...
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
长啊长就知道了
2017-12-25 · TA获得超过163个赞
知道小有建树答主
回答量:157
采纳率:33%
帮助的人:79.1万
展开全部
没选择到元素,应该吧var mdiv = document.getElementById("content");
var mli = mdiv.getElementsByTagName("li");写到onclick方法里面。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式