zoukankan      html  css  js  c++  java
  • JS一个非常经典的问题:在遍历数组时对DOM监听事件,索引值将始终等于遍历结束后的值

    一个简单的Tab选项卡点击事件。

    <style type="text/css">
    ul{padding:0;margin:0;}
    .tab{400px;}
    .tab-menuWrapper{padding-left:20px;}
    .tab-menuWrapper li{float:left;display:inline;padding:5px;border:1px solid #333;border-bottom:none;margin-right:5px;}
    .tab-contentWrapper{border:1px solid #333;clear:left;padding:5px;}
    </style>
    <div class="tab">
    <ul class="tab-menuwrapper">
    <li>menu1</li>
    <li>menu2</li>
    <li>menu3</li>
    </ul>
    <div class="tab-contentwrapper">
    <div>content1</div>
    <div style="display:none">content2</div>
    <div style="display:none">content3</div>
    </div>
    </div>
    

      然后我们需要一点js来实现,鼠标点击时content内容的切换。

    <script type="text/javascript">
    var tabMenu=document.getElementById("tab-menuWrapper").getElementsByTagName("li");
    var tabContent=document.getElementById("tab-contentWrapper").getElementsByTagName("div");
    for(var i=0;i<tabmenu .length;i++){
      tabMenu[i].onclick=function(){  
        for(var j=0;j<tabContent.length;j++){      tabContent[j].style.display="none";
        }     tabContent[i].style.display="block";
      } } </script>

      我们希望借助于数组和循环来完成这个任务,但是我们发现上述代码不能完成我们的任务,会报错:“tabContent[i] is undefined”. 我们利用alert(i)检测一下。

    for(var i=0;i<tabmenu .length;i++){
      tabMenu[i].onclick=function(){
        alert(i);   //3,3,3 why???
        for(var j=0;j<tabContent.length;j++){ 
           tabContent[j].style.display="none";   
        }
        tabContent[i].style.display="block";   
      } }

      当我们点击tabMenu1,2,3时,不是弹出0,1,2而是弹出3,3,3。所以后面的tabContent[i]会是undefined。(tabContent[i]中i实际上只有0,1,2)解决这个问题,我们可以使用闭包。

    for(var i=0;i</tabmenu><tabmenu .length;i++){
    (function(_i){
      tabMenu[_i].onclick=function(){
        for(var j=0;j<tabContent.length;j++){
          tabContent[j].style.display="none";
        }
        tabContent[_i].style.display="block"; 
      } })(i); }

      或者我们给DOM节点添加_index属性,属性值等于索引:

    for(var i=0;i</tabmenu><tabmenu .length;i++){
       tabMenu[i]._index=i;
       tabMenu[i].onclick=function(){
           for(var j=0;j<tabContent.length;j++){
              tabContent[j].style.display="none";  
        }   tabContent[this._index].style.display="block";
      } }

      虽然解决了问题。但是为什么在onclick里的索引值是循环结束后的最终值???一直不是很明白,求高人指点!!!

  • 相关阅读:
    vue 购买弹出框 动画
    vue 和animate.css 的动画使用
    获得url地址?后的参数
    Java 实现随机数组元素升降序
    java for循环实现九九乘法表
    java 随机生成字符串验证码
    Mysql插入值时,避免重复插入
    Mysql的unique和primary key
    2020 3.6日电话面试(某外包公司)
    Intellij IDEA配置javaweb项目
  • 原文地址:https://www.cnblogs.com/wait-hua/p/4479541.html
Copyright © 2011-2022 走看看