JS的for循环总是弹出最后一个值得解决方法

首先看一下HTML内容:

<div>
   <ul>
       <li>单纯</li>
       <li>善良</li>
       <li>纯真</li>
       <li>坚毅</li>
       <li>果敢</li>
   </ul>
</div>

现在我想得到标签内的索引和内容,你也许刷刷的写下以下代码:

  for (i = 0; i < els.length; i++) {
        var el = els[i];
        var text = el.innerHTML;
        el.onclick = function () {
            alert(i + "---" + text);
        }
    }

但是结果却不尽人意,总是弹出“6----果敢”,比较好的解决方法有以下几种:

1、使用闭包

 var els = document.getElementsByTagName("li");
    for (i = 0; i < els.length; i++) {
        var el = els[i];
        el.onclick = function (i) {
            var text = el.innerHTML;
            return function () {
                alert(i + "---" + text);
            }
        }(i)
    }

注意这里的text变量,如果写在onclick事件外面,即使使用了闭包得出来的标签值也都是最后一个,这是因为onclick事件并不能使用事件外的变量,如果你的变量是在事件外获得的,你可以采用传参的形式进行使用。

2、引入jquery,使用其中的on或delegate进行事件绑定(它们都有事件代理的特性)

$("ul").delegate("li", "click", function(){
        var index = $(this).index();
        var text = $(this).html();
        alert(index + "----" + text);
    });
或者:

 $("ul").on("click", "li", function(){
        var index = $(this).index();
        var text = $(this).html();
        alert(index + "----" + text);
    });
3、 使用ES6中的新特性let来声明变量

用let来声明的变量将具有块级作用域,很明显可以达到要求,不过需要注意的是得加个'use strict'(使用严格模式)才会生效

var myul = document.getElementsByTagName("ul")[0];
var list = myul.getElementsByTagName("li");
function foo(){'use strict'
  for(let i = 0, len = list.length; i < len; i++){
    list[i].onclick = function(){
      alert(i + "----" + this.innerHTML);
    }
  }
}
foo();
个人比较推荐第一种和第二种,第三种有的js版本不支持let形式来声明变量。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值