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里的索引值是循环结束后的最终值???一直不是很明白,求高人指点!!!

  • 相关阅读:
    IO流2 --- File类的常用方法1 --- 技术搬运工(尚硅谷)
    IO流1 --- File类的实例化 --- 技术搬运工(尚硅谷)
    luoguP6136 【模板】普通平衡树(数据加强版)
    CF981E Addition on Segments 线段树分治+bitset
    LOJ#2538. 「PKUWC2018」Slay the Spire DP+组合
    LOJ#2537. 「PKUWC2018」Minimax 线段树合并
    luoguP4220 [WC2018]通道 随机化
    学习笔记2018/6/22
    git push解决办法: ! [remote rejected] master -> master (pre-receive hook declined)
    IDEA错误:Cannot start compilation: the output path is not specified for module "Test". Specify the out
  • 原文地址:https://www.cnblogs.com/wait-hua/p/4479541.html
Copyright © 2011-2022 走看看