html中事件处理中的this和event对象
在用js编写页面事件处理代码时,会经常涉及到this和event对象,但有时在采用不同的事件处理,尤其是在与自定义的对象关联时,这些对象的指向变的有些复杂。
本文来详细介绍下各种场景下 这些对象 真正指向。
一、事件直接写在html标签中
1、案例1:
<button onclick="clickBtn()">测试</button>
处理代码如
function clickBtn(){
        alert(this.location.href);
    }
这时的 this 是指向全局 Window对象。
2、案例2:
<button onclick="clickBtn(this)">测试</button>
处理代码如
function clickBtn(obj){
        alert(obj.innerHTML);
    }
这时的 上述方法中的 obj指向的是按钮本身。也就是在 onclick="clickBtn(this)"传入的this对象指向事件触发的按钮。
3、冒泡
<div onclick="clickBtn(this)"><button >测试</button></div>
因为html事件的冒泡特性,虽然上面的onclick事件写在div上,这时无论是点击按钮还是div区域,都会触发div上绑定的事件。
但无论点击的是哪个,会发现 事件响应传入的 this指向的是 div,不是button.
在这种方式下,我们除了可以将this对象传给事件处理函数外,还可以将event对象传给事件处理函数。event对象包含了触发事件的各种信息。
<button onclick="clickBtn(event)">测试</button>
4、事件响应函数为对象的方法
我们看下,如果事件响应的函数为对象的方法,会出现什么变化。
<button onclick="handleDemo.clickBtn(this)">测试</button>
代码如下
<script>
function HandleDemo(){
this.msg="good";
}
HandleDemo.prototype.clickBtn=function(obj){
alert(obj.innerHTML);
alert(this.msg);
}
var handleDemo = new HandleDemo();
</script>
这时会发现 clickBtn 方法中的 this 指向的是 handleDemo 对象。 参数obj因为是传入的,指向的是button对象,这个没变。
说明:直接在html标签中绑定事件,是一件非常不好的编码习惯,强烈不建议推荐。下面我们介绍用jquery进行事件处理。
二、利用jquery绑定事件
1、方式一:
<button id="btn">测试</button>
脚本代码
<script>
$("#btn").click(clickBtn);
function clickBtn(event){
alert(this.innerHTML);
alert(event.currentTarget.innerHTML);
}
</script>
上面代码 通过调用jquery对象的 click方法,参数就是事件响应处理函数。
这个函数可以带一个参数,jquery会把事件对象event传入。参数名可以是任意的,不一定叫event。
如果不定义参数,在函数中也可直接使用event。但一般如果需要用到event对象,最好显式定义下。
这时我们会发现,在函数体中直接使用的this指向的是 button对象。 我们可以不显示的定义对象,采用匿名函数的方式,如:
<script>
$("#btn").click(function(ev){
alert(this.innerHTML);
alert(ev.currentTarget.innerHTML);
});
</script>
这个代码与上面代码的效果完全一样。
我们再来看下,如果传给click方法的是对象的方法呢?
<script>
function HandleDemo(){
this.msg="good";
}
HandleDemo.prototype.clickBtn=function(ev){
alert(this.innerHTML);
alert(ev.currentTarget.innerHTML);
}
var handleDemo = new HandleDemo(); $("#btn").click(handleDemo.clickBtn);
</script>
这时,我们发现clickBtn中的 this指向的依然是 button对象,并不是我们想象中的 handleDemo对象。
这样就带来一个很大的问题,因为clickBtn方法是handleDemo对象的成员,如果我们想要在clickBtn方法中访问handleDemo对象的其它成员,却没办法了。
除非直接使用全局变量,而这是很不推荐的。
下面我们介绍jquery的另外一种事件绑定方法。
2、方式二:bind方法
html代码依然不变
<button id="btn">测试</button>
脚本代码
<script>
function clickBtn(ev){
alert(this.innerHTML);
alert(ev.currentTarget.innerHTML);
}
$("#btn").bind("click",clickBtn);
</script>
这时,事件处理方法依然有一个参数指向event对象。
我们发现 clickBtn中的 this 指向的是 button对象。
bind函数,有三个参数,第一个是代表事件类型;第二个是传递给事件处理的额外信息对象(会赋值给event的data属性);第三个是事件处理函数。
上面例子我们只使用了第1个和第3个。下面我们看下例子:
<script>
function clickBtn(ev){
alert(this.innerHTML);
alert(ev.currentTarget.innerHTML);
alert(ev.data.msg);
}
$("#btn").bind("click",{msg:"hello"},clickBtn);
</script>
采用这种方式,我们传递了额外的对象给事件处理函数。这在某些场景下还是能用到的。
下面我们看下这种方式下传入的事件处理函数是对象的方法:
<script>
function HandleDemo(){
this.msg="good";
}
HandleDemo.prototype.clickBtn=function(ev){
alert(this.innerHTML);
alert(ev.currentTarget.innerHTML);
alert(ev.data.msg);
}
var handleDemo = new HandleDemo(); $("#btn").bind("click",handleDemo,handleDemo.clickBtn);
</script>
我们可以将对象本身作为bind方法的第二个参数传入。以解决在方法中无法访问对象其它成员的问题。
注意:采用jquery的事件绑定,无论是用bind方法,还是上一种方法。 如果调用多次,会绑定多次,而不会后面的覆盖前面的,事件触发时,事件函数会被多次执行。
html中事件处理中的this和event对象的更多相关文章
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
		
一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...
 - JS中的event 对象详解
		
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
 - Qt中事件处理的顺序
		
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:Qt中事件处理的顺序 文章内容主要来自 ...
 - 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
		
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...
 - (转)javascript中event对象详解
		
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
 - js事件中的event对象
		
addEvent(oDiv,"click",function(event){ console.log(event.bubbles+"事件是否冒泡"); cons ...
 - Nginx事件处理中的connection和read、write事件的关联
		
/********************************************************************* * Author : Samson * Date ...
 - js中的Event对象
		
event代表事件的状态,例如触发event对象的元素,鼠标的位置及状态,按下的键等等 event对象只在事件发生的过程中才有效. <!DOCTYPE html><html lang ...
 - 【好文收藏】javascript中event对象详解
		
event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEleme ...
 
随机推荐
- IO调度算法研究1
			
linux kernel 2.6之后提供了四种IO调度算法,每种调度算法都有其不同的特点和应用场景,系统使用者可以通过系统提供的接口,选择使用哪种IO调度算法,以及调整IO调度算法的参数,以达到最优的 ...
 - MCE遥控---用遥控器玩电脑
			
实现功能:利用Vista/Windows7的Media Center或者iMCE的支持,配上电脑遥控器,就可以在电视上用遥控器玩电脑,看高清.听音乐.看照片.录电视等.遥控器比鼠标操作起来更加自然,家 ...
 - Codecs是以plugin的形式被调用的(显示中文的codec plugin文件是qcncodecs4.dll),可静态载入和动态载入
			
作为非英语国家人员开发的类库,QT有充分的理由优先考虑支持Unicode和各国自定义字库编码.大家也知道了QT对软件Internationalization有一套完整的开发模型,包括专门为此写的lin ...
 - 用于展现图表的50种JavaScript库
			
在很多项目中都会有在前端展现数据图表的需求,而在开发过程中,开发者往往会使用一些JavaScript库,从而更有效地达到想要的目标.最近,TechSlide上的一篇文章总结了50种用于展现图表的Jav ...
 - 启用Apache Mod_rewrite模块
			
Ubuntu 环境 在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块. 另外,也可以通过将 /etc/apache2/mods-available ...
 - CSS3属性之border-radius
			
一.语法: 代码如下: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 二.取值: <length& ...
 - google chrome字体最小12px的问题
			
解决Google浏览器不支持12px以下的字体大小的问题,有时设定了12PX,可在浏览器看时确不起作用 网络出现内核的浏览器有微软的Internet Explorer, Mozilla的Firefox ...
 - 「OC」构造方法和分类
			
一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...
 - JavaSE学习总结第14天_API常用对象4
			
14.01 如何校验一个QQ号码案例 import java.util.Scanner; /* * 校验qq号码. * 1:要求必须是5-15位数字 * 2:0不能开头 * * 分析: * A:键 ...
 - BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )
			
裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...