js闭包for循环总是只执行最后一个值得解决方法

<style>
li{
list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;cursor: pointer;
}
</style>

html代码:
<ul id="uls">
    <li style="background:#aaa">0</li>
    <li style="background:#bbb">1</li>
    <li style="background:#ccc">2</li>
    <li style="background:#ddd">3</li>
</ul>

//这样写的话每次弹出都是最后一个值
// var lis=document.getElementsByTagName(‘li‘);
// for (var i = 0; i <=lis.length; i++) {
// lis[i].onclick = function(){
// alert(i);
// }
// };

使用闭包方法解决

//解决方法一:
var lis=document.getElementsByTagName(‘li‘);
for (var i = 0; i <=lis.length; i++) {
    (function(i){
        lis[i].onclick = function(){
            alert(i);
        }
    })(i);
};

//解决方法二:
var lis=document.getElementsByTagName(‘li‘);
for (var i = 0; i <=lis.length; i++) {
    lis[i].onclick = function(n){
        return function(){
            alert(n);
        }
    }(i);
};

//解决方法三(jquery):
$("ul li").click(function(){
    var index = $(this).index(); //获取索引下标 也从0开始
    alert($(this).html());
});

时间: 2024-08-11 07:47:41

js闭包for循环总是只执行最后一个值得解决方法的相关文章

IE下使用excanvas.js之后动态创建的canvas不支持getContext的解决方法(转)

IE下使用excanvas.js之后动态创建的canvas不支持getContext的解决方法(转) IE下使用excanvas.js之后,动态创建的canvas不支持getContext的解决方法 引入excanvas.js以后,在ie下,文档中的canvas就可以用了,但是如果是通过createElement方法创建的就不行了 var canvas=document.createElement(”canvas”); if(canvas.getContext){ alert(”support

android-继承BaseAdapter--自定义适配器,getView执行多次的解决方法

定义的getView执行多次的ListView布局: [html] view plaincopy <ListView android:id="@+id/lv_messages" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layo

ffmpeg在shell循环中只执行一次问题

最近写了一个shell脚本,发现 ffmpeg 命令只执行了一次就停了,最后找到原因: ffmpeg有时会读取标准输入流,导致命令出错,解决办法是在ffmpeg命令之后添加 #xxx ffmpeg xxx < /dev/null #xxx 就可以了 参考:execute ffmpeg command in a loop

Js闭包与循环

目标:点击任何一个li,提示当前点击位置 <ul> <li>第1个</li> <li>第2个</li> <li>第3个</li> <li>第4个</li> <li>第5个</li> </ul> <script> var li = document.getElementsByTagName('li'); for (var i = 0; i< li.

js中如何在一个函数里面执行另一个函数

1.js中如何在函数a里面执行函数b function a(参数c){ b(); } function b(参数c){ } ps:在需要传参的情况下,函数a里面的参数c同时可以传到函数b里面. 2.如何20秒后执行另一个函数 function a(){ setTimeout(b,20000)}function b(){ alert("20秒以后了哦")} 3.什么是回调函数 回调就是一个函数的调用过程.回调,回调,就是回头调用的意思.函数a的事先干完,回头再调用函数b. 函数a有一个参

jmeter-逻辑控制器之 交替控制器(实现2个请求每次只执行其中一个)

交替控制器: 案例:两个请求每次只能执行其中一个,可使用交替控制器. 1.线程组->添加->逻辑控制器->交替控制器 2.在控制下添加两个http请求.运行的时候第一次循环执行第一个,第二次循环执行第二个,第三次执行第一个...

ajax跨域往php程序post数据时,php程序总是执行两次的解决方法

php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Access-Control-Allow-Origin:*'); header("Access-Control-Allow-Headers: x-requested-with,content-type"); header('Access-Control-Allow-Methods: OPTION

ASP.NET 使用js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

在写这篇的时候本来想把标题直接写成报错的提示,如下: "SecurityError:Blocked a frame with origin "http://localhost:55080" from accessing a cross-origin frame." 但是有点长,会显示不全,就想还是换一下吧,想了一下 "ASP.NET 上传过大图片或文件报错解决办法", 然后当我写完这个题目之后,我觉得这篇文章好像根本没有写的必要,估计看完题目就会

ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080" from accessing a cross-origin frame.” 但是有点长,会显示不全,就想还是换一下吧,想了一下 “ASP.NET 上传过大图片或文件报错解决办法”, 然后当我写完这个题目之后,我觉得这篇文章好像根本没有写的必要,估计看完题目就会想到关于web.config配置的方面了