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

  1. <style type="text/css">
  2. ul{padding:0;margin:0;}
  3. .tab{width:400px;}
  4. .tab-menuWrapper{padding-left:20px;}
  5. .tab-menuWrapper li{float:left;display:inline;padding:5px;border:1px solid #333;border-bottom:none;margin-right:5px;}
  6. .tab-contentWrapper{border:1px solid #333;clear:left;padding:5px;}
  7. </style>
  8. <div class="tab">
  9. <ul class="tab-menuwrapper">
  10. <li>menu1</li>
  11. <li>menu2</li>
  12. <li>menu3</li>
  13. </ul>
  14. <div class="tab-contentwrapper">
  15. <div>content1</div>
  16. <div style="display:none">content2</div>
  17. <div style="display:none">content3</div>
  18. </div>
  19. </div>

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

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

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

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

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

  1. for(var i=0;i</tabmenu><tabmenu .length;i++){
  2. (function(_i){
  3.   tabMenu[_i].onclick=function(){
  4.     for(var j=0;j<tabContent.length;j++){
  5.       tabContent[j].style.display="none";
  6.     }
  7.     tabContent[_i].style.display="block";
      }
  8. })(i);
  9. }

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

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

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

JS一个非常经典的问题:在遍历数组时对DOM监听事件,索引值将始终等于遍历结束后的值的更多相关文章

  1. jQuery监听事件经典例子

    关键字:jQuery监听事件经典例子  js代码:  ============================================================  $(function( ...

  2. node.js绑定监听事件EventEmitter类

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下: // 引入 events 模块 var events = r ...

  3. php 中遍历数组时使用引用出现的问题

    今天在使用foreach遍历数组时发现,当使用&时会出现问题: $arr = array( array('id' => 100, 'error'=> 'aa'), array('i ...

  4. JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件

    JS: document.getElementById("input对象的ID").addEventListener('input',function(){ console.log ...

  6. Android 属性动画监听事件与一个菜单的例子

    简单监听事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  7. js监听事件的绑定与移除

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  8. 以forin的方式遍历数组时进行删除操作的注意点

    今天在修改某项需求的时候,需要在遍历的时候将匹配项移除掉,采用的时forin的方式遍历,然后运行的时候却crash掉了 for (NSString*str in self.btnArray) { if ...

  9. JS监听事件错误:Uncaught TypeError: xx(函数名)is not a function at HTMLInputElement.onclick

    事件监听一直出错,提示已定义的函数名不是一个函数,折腾了好久才想到,原来是函数名和JS内部关键字重名造成的. 以前也遇到过这种情况,但因为发生的概率比较小,就没太在意,但是这次感觉这方面确实需要注意, ...

随机推荐

  1. slfj4 + logback

    slf4j:(Simple Logging Facade for Java,简单日志门面),它不是具体的日志解决方案,只服务于各种各样的日志系统.在使用SLF4J的时候,不需要再代码中或配置文件中指定 ...

  2. logname,who -m,who -q,id,su,su -l 用户名,su -,date,cal,cal 12 2009,cal -y 2008,du -s 目录,

    logname,who -m,who -q,id,su,su -l 用户名,su -,date,cal,cal 12 2009,cal -y 2008,du -s 目录,

  3. HDU 1011 Starship Troopers星河战队(树形dp)

    题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...

  4. UML复习1-2章

    第一章 1.请对SDLC的六个阶段排序 1> 可行性分析 2> 设计 3> 测试 4> 维护 5> 需求分析与说明 6> 编码 A. 1 5 2 6 3 4 B. ...

  5. 碰到一个微软的bug:CWinAppEx::GetString

    在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了MFC框架所以,为了简化代码直接使用了CWinAppEx::GetString .CWinAppEx::SetS ...

  6. 如果CDN服务器出了问题,怎么做不影响自己的网站

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3.jquery.min.js"></ ...

  7. Exceptions and Errors on iOS

    异常:程序缺陷导致:不可恢复:给开发者使用: 错误:资源受限导致:可恢复:提示给用户. https://blog.jayway.com/2010/10/13/exceptions-and-errors ...

  8. [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors

    MetaAnchor: Learning to Detect Objects with Customized Anchors Intro 本文我其实看了几遍也没看懂,看了meta以为是一个很高大上的东 ...

  9. 解决Win10桌面右键卡顿一直转圈圈的

    把系统重置之后,发现在桌面点击右键时一直转圈,但是在文件夹等非桌面位置都正常.可能是我之前修改注册表添加右键选项造成的,也可能不是,因为将修改的地方删除还是没有解决问题,555. 上网搜素一波,发现大 ...

  10. Ubuntu 上配置静态的ip

    先关掉或卸掉 network-manager.然后,改动/etc/network/interfaces 如下:(由于是静态ip,你当然知道把例子中那些东西改成你自己的)auto lo eth0ifac ...