JS 循环给li绑定参数不同的点击事
以下内容纯属个人理解,不正确的地方还请大神留言,不胜感激!
源代码:(按个人方式选用一种即可)
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script type="text/javascript">
var aLi = document.getElementsByTagName("li");
for(var i=0; i<aLi.length; i++){
/* 方式一(通过调用一个闭包函数,来保存当前变量i) */
show(i);
function show(i){
aLi[i].onclick = function(){console.log(i);}
}
/* 方式二(方法一的即时调用写法,原理不变)*/
(function(x){
aLi[x].onclick = function(){console.log(x);}
})(i);
/* 方式三 (通过给当前节点自定义一个属性值,来保存变量i) */
aLi[i].index=i;
aLi[i].onclick = function(){
console.log(this.index);
};
} /* end for*/
</script>
刚开始的时候不是很理解方法二,经过一番折腾,才弄明白。
此处对变量i的存储用了"JS闭包"相关的知识,并通过一个“即时函数”来简洁代码
先看下下面的这个:
<script type="text/javascript">
function fun(){
return 5
}
var a=fun;
var b=fun();
</script>
函数:JS函数是一种叫做function引用类型的实例,因此函数是一个对象,它保存在内存中,函数名则是指向这个对象的指针。例如以上的 "fun"
var a = fun 意思是把函数名的指针拷贝一份给a,并不是函数的本身,也不是函数执行后的返回值
如果函数名后面加上圆括号,就表示立即调用(执行)这个函数里面的代码(花括号里的代码)。
同理:函数声明和函数表达式在私有作用域写法方面也会在函数体后面加圆括号表示立即调用
同理,我们可以想到像下面这样调用函数
function fun(){
return 5
}();
然而这样是错误的,因为JavaScript 将function 关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。要将函数声明转换成函数表达式,只要像下面这样给它加上一对圆括号即可。
(function fun(){
return 5
})();
到这,应该就理解了刚开始的函数执行方式了,只是在括号里加了一个参数i,然后每次弹出i,也就是当前li标签在数组中的下标。
扩展:如果想进一步了解,可以看下 " javaScript中如何应用 '即时函数 '模仿块级作用域 ".
JS 循环给li绑定参数不同的点击事的更多相关文章
- js循环给li绑定事件实现 点击li弹出其索引值 和内容
代码如下: html代码 <ul> <li>房产</li> <li>家居</li> <li>二手房</li> < ...
- js循环给li绑定事件实现和弹出对应的索引
原文:http://www.cnblogs.com/wuchuanlong/p/5945286.html 方法一,动态添加click事件,并添加属性 var itemli = document.get ...
- js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性
js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性 <!doctype html> <html> <head> <meta char ...
- JS: javascript 点击事件执行两次js问题 ,解决jquery绑定click事件出现点击一次执行两次问题
javascript 点击事件执行两次js问题 在JQuery中存在unbind()方法,先解绑再添加点击事件,解决方案为: $(".m-layout-setting").unbi ...
- vue.js循环语句
vue.js循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组, site 是数组元素迭代的别名. v-for 可以 ...
- js循环添加事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery图片无缝滚动JS代码ul/li结构
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 原生js实现数据双向绑定
最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HT ...
- JS循环中使用bind函数的参数传递问题
JS循环中使用bind函数的参数传递问题,问题代码如下: for (var sc in result) { var tempp = '<div class="sidebar_todo_ ...
随机推荐
- Play Framework 完整实现一个APP(十四)
添加测试 ApplicationTest.java @Test public void testAdminSecurity() { Response response = GET("/adm ...
- 不同数据库,查询前n条数据的SQL语句
不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...
- php将对象数组转成普通数组
不知道为什么,把数组序列化为json,然后存到redis(string类型).然后再取出来反序列化为数组,就变成对象数组了 thinkPHP普通数组取值$arr['key'] 对象数组取值$arr-& ...
- rhel7 单用户修改root密码
rhel7密码忘记的时候,可以通过单用户模式修改密码 1.修改 引导文件,添加rw init=/sysroot/bin/sh ,ctrl+x启动 2.切换根chroot /sysroot3.使用pas ...
- centos本地yum源安装
1.为DVD或U盘创建一个用于挂载的目录 [root@localhost ~]# mkdir /media/CentOS/ 2.查看DVD或U盘所在的路径 [root@localhost ~]# fd ...
- Swift和Objective-C混编注意事项
前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- Intellij IDEA的一些东西
Intellij IDEA的一些东西 2016-03-19 15:26 Ctrl + R 在当前文件进行文本替换 (必备) Ctrl + N 根据输入的 类名 查找类文件 Ctrl + Ctrl + ...
- mac 终端 svn 命令
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain ...
- Paxos
Paxos算法原理与推导 Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不 ...