为dom添加点击事件,由此引发this指向的思考
下午没有任务,闲来无事仿个小网页巩固下基础知识。由于公司安全规定,原网页截图不便上传(也没法上传),回家后做了个简单的菜单以图示:
目标:点击某选项时,该选项底边加粗
1.首先定义click方法,然后在点击元素时调用该方法。('curr'类即红框内底边加粗效果)
var liElements = document.getElementsByClassName('headLi');
var addClick = function() {
var currElement = document.getElementsByClassName('curr')[0];
if (this !== currElement) {
currElement.className = currElement.className.replace('curr', '');
this.className = this.className + ' curr';
console.log('this=' + this + 'currElement=' + currElement);
}
}
for (var i = 0; i < liElements.length; i++) {
liElements[i].onclick = function() {
addClick();
}
}
结果:加粗效果消失,第二次点击时控制台报错:


2.在绑定事件时直接写点击事件的方法
var liElements = document.getElementsByClassName('headLi');
for (var i = 0; i < liElements.length; i++) {
liElements[i].onclick = function() {
var currElement = document.getElementsByClassName('curr')[0];
console.log('this=' + this + 'currElement=' + currElement);
if (this !== currElement) {
currElement.className = currElement.className.replace('curr', '');
this.className = this.className + ' curr';
}
}
}
结果:功能正常


根据控制台可以看出,原因就在于this的指向:第一种方法中,this在“无所属对象的函数”中调用,指向了全局对象,第一次点击时,移除了元素的'curr'类,但没法为被点击的元素绑定'curr',于是当第二次点击时,控制台报undefined,无法找到绑定'curr'类的元素。
而第二种方法中,this所在的方法属于liElements[i]对象,于是指向了被点击的元素,一切正常。
关于this的用法可以参考博客:http://www.cnblogs.com/nimojs/p/javascript-this.html
为dom添加点击事件,由此引发this指向的思考的更多相关文章
- echart字符云之添加点击事件
// 路径配置 require.config({ paths : { echarts : 'jquery/echarts-2.2.7/build/dist' } }); // 使用EChart.js画 ...
- ECharts问题--散点图中对散点添加点击事件
1. 我们这次就没有先讲解怎么使用散点图了,这个跟之前的一些图还是很类似的,不会的可以去官网上面查看 API 使用.我们这次讲解的是为散点图中的散点添加点击事件,然后在图表之外的一个 div 里面显示 ...
- iOS开发小技巧 - label中的文字添加点击事件
Label中的文字添加点击事件 GitHub地址:https://github.com/lyb5834/YBAttributeTextTapAction 以前老师讲过类似的功能,自己懒得回头看了,找了 ...
- 【Swift 2.1】为 UIView 添加点击事件和点击效果
前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ...
- ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签
jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...
- 继承UIView的子控件添加点击事件
UITapGestureRecognizer*tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:selfaction:@select ...
- 如何在UILable上添加点击事件?
最近开始学习iOS开发,今天上来写第一个iOS笔记 昨天碰到一个需求,在UILable上添加点击事件,网上找了写资料,有人建议用透明的UIButton覆盖,有人建议写一个集成自UILable的类,扩展 ...
- jquery无法为动态生成的元素添加点击事件的解决方法
遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <d ...
- Qt:添加点击事件的Label并显示图片
1.给label添加点击事件 Qt中原本的label是没有点击事件的,如果想添加点击事件的话,可以继承QLabel类并重载鼠标事件(比如mousePressedEvent),然后在鼠标事件中发送一个信 ...
随机推荐
- [linux] 指令记录
1> 查看linux版本号 lsb_release -a cat /etc/redhat-release
- localhost访问错误Forbidden You don't have permission to access / on this server.解决办法(亲测)
在httpd.conf文件下找到这段: <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow D ...
- DebugLog 打印方法执行时间
DebugLog 打印方法执行时间 用于方便调试性能问题的打印插件.给访法加上@DebugLog,就能输出该方法的调用参数,以及执行时间. Project gradle配置 // Top-level ...
- jQuery.first() 函数
first() 函数详解 函数 获取当前对象的第一个元素 语法 $selector.first() 返回值 返回值为一个对象 实例说明 代码 <!DOCTYPE html><html ...
- php总结 --- 18. 七牛云存储
第三方资源拉取 /** * 七牛云抓取文件 * @param string $url 文件URL地址 * * 参考地址:http://developer.qiniu.com/code/v6/api/k ...
- go并发和并行
Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop ...
- Python_Day11_同步IO和异步IO
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...
- 安卓自定义View(一)自定义控件属性
自定义View增加属性第一步:定义属性资源文件 在/res/values 文件夹下建立"Values XML layout",按照如下定义一个textview的属性 <?xm ...
- 在VIM中进行快速的查找和替换
VIM是被誉为非常高效的文本编辑软件.但是掌握并高效的使用是件有难度的事情.在VIM中进行快速的查找和替换是提高VIM使用效率的重要方法.下面是我在阅读VIM用户手册时整理的一些资料: 行内搜索. f ...
- netty4.0.x源码分析—bootstrap
Bootstrap的意思就是引导,辅助的意思,在编写服务端或客户端程序时,我们都需要先new一个bootstrap,然后基于这个bootstrap调用函数,添加eventloop和handler,可见 ...