在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有关的信息。包括导致事件的元素、事件的类型和事件的相关信息。例如鼠标操作的事件中,会包含鼠标的位置信息。而键盘触发的事件会包含与按下的键有关信息。所有浏览器都支持event对象,但支持方式不同。

  • DOM中的事件对象

  兼容dom的浏览会将一个event对象传递到事件处理程序中。

 var aa=document.getElementById("aa");
aa.onclick=function(event){
console.log(event.type);
}
aa.addEventListener("click",function(event){
console.log(event.type);
},false);

  上面的代码,通过两种方式指定事件处理程序,但是他们可以获得event对象。event.type都是输出click。

属性/方法

类型

读/写

说明

bubbles

Boolean

只读

事件是否冒泡

cancelable

Boolean

只读

是否可以取消事件的默认行为

currentTarget

Element

只读

事件处理程序正在处理的那个元素

defaultPrevented

Boolean

只读

是否已经调用了preventDefault方法

detail

Integer

只读

事件的细节信息

eventPhase

Integer

只读

调用事件处理程序的阶段

preventDefault()

Function

只读

取消事件的默认行为

stopImmediatePropagation()

Function

只读

取消事件的进一步捕获或者冒泡

stopPropagation()

Function

只读

取消事件的进一步冒泡或者捕获

target

Element

只读

事件的目标

trusted

Boolean

只读

为true表示事件是浏览器生成,false表示JavaScript添加

type

String

只读

被触发事件的类型

view

AbstarctView

只读

与事件关联的抽象视图

  上面的表格列出了event的属性以及方法,在事件处理程序内部,对象this始终等于currentTarget的值,而target则包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,则this、target和currentTaget包含相同的值。

 aa.addEventListener("click",function(event){
console.log(event.target==this);//true
console.log(event.currentTarget==this);//true
},false);

  上面的代码中说明currentTarget、target和this的值是相同的。通过下面的代码,我们可以看出this就是指向元素本身。

 aa.addEventListener("click",function(event){
//console.log(event.target==this);//true
//console.log(event.currentTarget==this);//true
console.log(this==document.getElementById("aa"));//true
console.log(event.currentTarget==document.getElementById("aa"));//true
},false);

  要阻止特定事件的默认行为,可以使用preventDefault方法。例如a标签,在点击的时候,会跳转到指定的url链接,如果想阻止该行为的发生,可以调用preventDefault方法。

 document.getElementById("hh").onclick=function(event){
event.preventDefault();
}

  上面的代码将会阻止跳转事件的发生。只有cancelable为true,才能调用该方法。通过调用stopPropagation方法能够阻止事件的冒泡。

 document.getElementById("hh").onclick=function(event){
console.log(event.eventPhase);//
event.preventDefault();
}
document.body.onclick=function(event){
console.log(event.eventPhase);//
}
document.body.addEventListener("click",function(event){
console.log(event.eventPhase);//
},true);

  上面的代码中输出是1,2,3。由此可见,document.body.addEventListener最先执行,它发生在事件的冒泡阶段,document.getElementById("hh")第二个执行,发生在事件的处理程序目标阶段。document.body.onclick发生在事件的冒泡阶段。

  • IE中的事件对象

  在IE中方式event对象可以通过多种方式,取决于指定事件处理程序的方法。

 aa.onclick=function(){
var event=window.event;
console.log(event.type);
}

  上面的代码,我们通过window.event获取了event对象,并且可以取得它的属性和方法。但是如果通过attachEvent添加事件,则事件处理程序会传递一个event对象。

  IE的event对象同样包含创建它的相关属性和方法,与DOM事件一样,也会因为事件类型的不同而不同。

属性/方法

类型

读写

说明

cancelBubble

Boolean

读/写

默认false,设置为true,取消事件冒泡

returnValue

Boolean

读/写

默认为true,设置为false,取消事件的默认行为

srcElement

Element

只读

事件的目标,与target相同

  因为事件处理程序的指定方式不同,故它的作用域也不相同。最好不用this,可以使用srcElement来获取元素。

  如前所述,returnValue属性相当于DOM中的preventDefault方法,它们的作用都是取消给定事件的默认行为。只要将returnValue设置为false,就会阻止默认事件的发生。

 EventUtil.addEvent(document.getElementById("hh"),"click",function(event){
event.returnValue=false;
});
  • 跨浏览器的事件对象

  虽然DOM与IE的event对象不同,但是可以通过js库,来解决浏览器的兼容性。

  

 var EventUtil={
/**
* 添加事件
* @param {Object} element:元素本身
* @param {Object} type:事件名称
* @param {Object} fn:事件处理程序
*/
addEvent:function(element,type,fn){
if(element.addEventListener){
element.addEventListener(type,fn,false);
}
else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}
else{
element["on"+type]=fn;
}
},
/**
* 移除事件
* @param {Object} element:元素本身
* @param {Object} type:事件名称
* @param {Object} fn:事件处理程序
*/
removeEvent:function(element,type,fn){
if(element.removeEventListener){
element.removeEventListener(type,fn,false);
}
else if(element.detachEvent){
element.detachEvent("on"+type,fn);
}
else{
element["on"+type]=null;
}
},
/**
* 获取事件对象
* @param {Object} event
*/
getEvent:function(event){
return event||window.event;
},
/**
* 获取事件处理程序作用的目标元素
* @param {Object} event
*/
getTarget:function(event){
return event.currentTarget||event.srcElement;
},
/**
* 取消默认行为
* @param {Object} event
*/
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();
}
else{
event.returnValue=false;
}
},
/**
* 取消冒泡
* @param {Object} event
*/
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation();
}
else{
event.cancelBubble=true;
}
}
};

  上面的代码封装了事件处理中需要的方法,包括添加事件、移除事件、获取事件对象、获取事件的目标元素、阻止默认行为和阻止冒泡。

浅谈JavaScript的事件(事件对象)的更多相关文章

  1. 浅谈JavaScript中的事件

    引言 Html页面与JavaScript之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...

  2. 浅谈javascript的Touch事件

    js的touch事件,一般用于移动端的触屏滑动 代码如下: $(function(){ document.addEventListener("touchmove", _touch, ...

  3. 浅谈Javascript单线程和事件循环

    单线程 Javascript 是单线程的,意味着不会有其他线程来竞争.为什么是单线程呢? 假设 Javascript 是多线程的,有两个线程,分别对同一个元素进行操作: function change ...

  4. 通过一道笔试题浅谈javascript中的promise对象

    因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ...

  5. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  6. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  7. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  8. 浅谈javascript的原型及原型链

    浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...

  9. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  10. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

随机推荐

  1. 【LeetCode】Two Sum(两数之和)

    这道题是LeetCode里的第1道题. 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会 ...

  2. NYOJ 118 修路方案

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...

  3. 04-offsetLeft和style.left的区别

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

  5. BZOJ 4128 Matrix ——BSGS

    矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...

  6. K-lord #1

    Memories 布雷芙,和YYJ就那样在那个初夏相遇了. 她,一头蓬松的长发,简单可爱的短袖. 他,带着那么灿烂阳光的笑容. 于是一切就变得很微妙.眼神有了温度手心有了潮湿. 那些天空里匆忙盛开的夏 ...

  7. Spring JdbcTemplate 查询方法中的RowMapper实现汇总

    实现一.在内部建立内联类实现RowMapper接口 package hysteria.contact.dao.impl; import java.sql.ResultSet; import java. ...

  8. day2之爬取拉勾网

    认证流程 浏览器清空cookies 步骤一 访问拉勾网网站  https://www.lagou.com/ 做了些什么: 以get方式请求"https://www.lagou.com/&qu ...

  9. android悬浮窗口的一些说明

    1.xml文件里的权限申请 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" ...

  10. luogu P2085 最小函数值

    题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...