JS一个非常经典的问题:在遍历数组时对DOM监听事件,索引值将始终等于遍历结束后的值
一个简单的Tab选项卡点击事件。
- <style type="text/css">
- ul{padding:0;margin:0;}
- .tab{width: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里的索引值是循环结束后的最终值???一直不是很明白,求高人指点!!!
JS一个非常经典的问题:在遍历数组时对DOM监听事件,索引值将始终等于遍历结束后的值的更多相关文章
- jQuery监听事件经典例子
关键字:jQuery监听事件经典例子 js代码: ============================================================ $(function( ...
- node.js绑定监听事件EventEmitter类
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下: // 引入 events 模块 var events = r ...
- php 中遍历数组时使用引用出现的问题
今天在使用foreach遍历数组时发现,当使用&时会出现问题: $arr = array( array('id' => 100, 'error'=> 'aa'), array('i ...
- JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件
JS: document.getElementById("input对象的ID").addEventListener('input',function(){ console.log ...
- 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 ...
- js监听事件的绑定与移除
监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...
- 以forin的方式遍历数组时进行删除操作的注意点
今天在修改某项需求的时候,需要在遍历的时候将匹配项移除掉,采用的时forin的方式遍历,然后运行的时候却crash掉了 for (NSString*str in self.btnArray) { if ...
- JS监听事件错误:Uncaught TypeError: xx(函数名)is not a function at HTMLInputElement.onclick
事件监听一直出错,提示已定义的函数名不是一个函数,折腾了好久才想到,原来是函数名和JS内部关键字重名造成的. 以前也遇到过这种情况,但因为发生的概率比较小,就没太在意,但是这次感觉这方面确实需要注意, ...
随机推荐
- slfj4 + logback
slf4j:(Simple Logging Facade for Java,简单日志门面),它不是具体的日志解决方案,只服务于各种各样的日志系统.在使用SLF4J的时候,不需要再代码中或配置文件中指定 ...
- 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 目录,
- HDU 1011 Starship Troopers星河战队(树形dp)
题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...
- UML复习1-2章
第一章 1.请对SDLC的六个阶段排序 1> 可行性分析 2> 设计 3> 测试 4> 维护 5> 需求分析与说明 6> 编码 A. 1 5 2 6 3 4 B. ...
- 碰到一个微软的bug:CWinAppEx::GetString
在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了MFC框架所以,为了简化代码直接使用了CWinAppEx::GetString .CWinAppEx::SetS ...
- 如果CDN服务器出了问题,怎么做不影响自己的网站
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3.jquery.min.js"></ ...
- Exceptions and Errors on iOS
异常:程序缺陷导致:不可恢复:给开发者使用: 错误:资源受限导致:可恢复:提示给用户. https://blog.jayway.com/2010/10/13/exceptions-and-errors ...
- [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors
MetaAnchor: Learning to Detect Objects with Customized Anchors Intro 本文我其实看了几遍也没看懂,看了meta以为是一个很高大上的东 ...
- 解决Win10桌面右键卡顿一直转圈圈的
把系统重置之后,发现在桌面点击右键时一直转圈,但是在文件夹等非桌面位置都正常.可能是我之前修改注册表添加右键选项造成的,也可能不是,因为将修改的地方删除还是没有解决问题,555. 上网搜素一波,发现大 ...
- Ubuntu 上配置静态的ip
先关掉或卸掉 network-manager.然后,改动/etc/network/interfaces 如下:(由于是静态ip,你当然知道把例子中那些东西改成你自己的)auto lo eth0ifac ...