在触发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. unittest跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest提供了这些需求的装饰器. unittest.skip(reason) 无条 ...

  2. WordPress 多语言支持(本地化)

    本博客将介绍WordPress的多语言制作 首先需要在wp-content目录下创建一个languages文件夹,用于存放语言包文件. 然后在模板目录下的functions.php,然后在代码中添加函 ...

  3. 【SQL Server】SQL常用系统函数

    SQL常用系统函数 函数类型 函数表达式 功能 应用举例 字符串函数 SubString(表达式,起始,长度) 取子串 SubString('ABCDEFG',3,4) Right(表达式,长度) 右 ...

  4. BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组

    $ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...

  5. BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】

    题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...

  6. P1168 中位数 (优先队列,巧解)

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入 ...

  7. Win10下安装虚拟机提示“Intel VT-x处于禁用状态”如何解决

    今天在自己的笔记电脑上想安装一个Kali虚拟机学习用,安装的时候遇到这个问题,提示"Intel VT-x处于禁用状态". 要进入Win10的BIOS,先进入"设置&quo ...

  8. 拯救小矮人(codevs 2544)

    题目描述 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...

  9. android开发里遇到的坑——eclipse项目导入android studio以后Run按钮灰色

    android studio编译有错误但是没有提示给用户,关闭android studio重新启动项目后,会显示错误,修复以后即可!

  10. AOP面向方面(切面)编程

    1.引言 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度极地提 ...