在用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对象的更多相关文章

  1. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  2. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  3. Qt中事件处理的顺序

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:Qt中事件处理的顺序 文章内容主要来自 ...

  4. 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...

  5. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  6. js事件中的event对象

    addEvent(oDiv,"click",function(event){ console.log(event.bubbles+"事件是否冒泡"); cons ...

  7. Nginx事件处理中的connection和read、write事件的关联

    /*********************************************************************  * Author  : Samson  * Date   ...

  8. js中的Event对象

    event代表事件的状态,例如触发event对象的元素,鼠标的位置及状态,按下的键等等 event对象只在事件发生的过程中才有效. <!DOCTYPE html><html lang ...

  9. 【好文收藏】javascript中event对象详解

    event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEleme ...

随机推荐

  1. 8,SSO,,eager copy,COW

    针对字符串不同的长度,“编译器”选择不同的优化策略:SSO, eager copy,COW,分别针对短字符串,中等长度字符串,长字符串.不过,现在(2016)的大多数编译器(gcc 4.9.1,vs2 ...

  2. 对程序员的不尊重是中国it产业的悲哀。

    电脑刚进入中国时,“程序员”三个字是一份令人尊敬的岗位,那个时候中国互联网人才奇缺.程序员的价格也就水涨船高.小的时候电视里到处播放着电脑培训学院的招生广告.一说到程序员,给我们的印象都是白领,高薪的 ...

  3. Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)

    最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...

  4. HDU 1849 Rabbit and Grass

    题解:因为棋子可重叠,所以就等于取石子问题,即尼姆博弈,SG[i]=i,直接将输入数据异或即可. #include <cstdio> int main(){ int SG,n,a; whi ...

  5. Linux设置高分辨率后无法进入X系统

    Vmware9.0中Xubuntu分辨率从800x600变更为1366x768后在用户输入密码登录后会自动退出x系统,出现这种情况时可以切换到命令行登录界面,然后将-/.config/xfce4/xf ...

  6. HDU 2527

    题目描述          HDU 2527 分析         霍夫曼编码的应用.         本题没有必要构造一棵完整的霍夫曼树.只需利用霍夫曼编码的原理,每次挑选频率最低的两个元素进行合并 ...

  7. 【转】Tomcat7.0.42源代码运行环境搭建

    转自:http://tyrion.iteye.com/blog/1903608 以前看过Tomcat5的一部分源代码,当时只看了个大概的启动分析,后来看了<How Tomcat Works> ...

  8. zookeeper集群配置

    zookeeper集群网上demo一大堆,补充一下一些不明白的地方 1 复制2份zookeeper,savle作为备份节点 2.配置zoo.cfg # The number of millisecon ...

  9. Linux学习:find、chmod、ps命令

    下面介绍下linux下find.chmod.ps这三个常见命令的使用. 这每个命令都有很多可选的参数,不同参数体现的功能不一样.我们这里不一一介绍各种参数的含义,只介绍最常见的使用场景. 一.find ...

  10. Hadoop Hive与Hbase整合+thrift

    Hadoop Hive与Hbase整合+thrift 1.  简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...