JS 事件(3)——事件对象

事件对象

在触发DOM节点上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。

DOM中的事件对象

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title>事件对象</title>
 6     </head>
 7     <body>
 8         <div id="box">
 9             <input type="button" id="btn" value="button">
10         </div>
11     </body>
12 </html>

在上边的页面中,点击<input>元素,以input-div-body-html-document的顺序冒泡。

封装一个事件处理程序,如下:

 1 var event_util = {
 2     //添加事件
 3     addHandler: function(element, type, handler) {
 4         if(element.addEventListener) {
 5             element.addEventListener(type, handler, false);
 6         } else if(element.attachEvent) {
 7             element.attachEvent("on" + type, handler);
 8         } else {
 9             element["on" + type] = handler;
10         }
11     },
12     //移除事件
13     removeHandler: function(element, type, handler) {
14         if(element.removeEventListener) {
15             element.removeEventListener(type, handler, false);
16         } else if(element.detachEvent) {
17             element.detachEvent("on" + type, handler);
18         } else {
19             element["on" + type] = null;
20         }
21     }
22 };

event对象包含与创建它的特定事件有关的属性和方法。

bubbles属性与stopPropagation()方法:

 1 //表明事件是否冒泡
 2 function bubbles(event) {
 3     alert(event.bubbles);    //true
 4 };
 5 event_util.addHandler(btn, "click", bubbles);
 6 // 阻止事件冒泡
 7 function stopPropagation(event) {
 8     event.stopPropagation();
 9 };
10 event_util.addHandler(btn, "click", stopPropagation);

可以将事件处理程序与阻止事件冒泡写在一起;如:

1 function showMessage(event) {
2     alert("这个按钮不会冒泡!");
3     event.stopPropagation();
4 };
5 event_util.addHandler(btn, "click", showMessage);

stopImmediatePropagation(),阻止事件的进一步捕获或者冒泡,同时阻止任何事件处理程序被调用(DOM3级事件中新增);详情未知。

cancelable属性、preventDefault()方法与defaultPrevented()方法:

在html中新增一个<a>元素

1 <a href="http://www.baidu.com">百度</a>
 1 //获取<a>元素
 2 var link = document.getElementById("link");
 3 //表明是否可以取消事件的默认行为
 4 function cancelable(event) {
 5     alert(event.cancelable);    //true
 6 };
 7 event_util.addHandler(link, "click", cancelable);
 8 //取消事件的默认行为
 9 function preventDefault(event) {
10     event.preventDefault();
11 };
12 event_util.addHandler(link, "click", preventDefault);
13 //查询是否已经取消事件的默认行为
14 function defaultPrevented(event) {
15     alert(event.defaultPrevented);    //true
16 };
17 event_util.addHandler(link, "click", defaultPrevented);

取消默认行为之后,超链接将不能正常跳转到指定页面。

type属性,被触发事件的类型。

1 function type(event) {
2     alert(event.type);    //"click"
3 };
4 event_util.addHandler(btn, "click", type);

在需要通过一个函数来处理多个事件时,可以使用type属性。

 1 var btn = document.getElementById("btn");
 2 function handler(event) {
 3     switch(event.type) {
 4         case "click":
 5             alert("You‘ve clicked the button");
 6             break;
 7         case "mouseover":
 8             event.target.style.backgroundColor = "blue";
 9             break;
10         case "mouseout":
11             event.target.style.backgroundColor = "";
12             break;
13     }
14 };
15 event_util.addHandler(btn, "click", handler);
16 event_util.addHandler(btn, "mouseover", handler);
17 event_util.addHandler(btn, "mouseout", handler);

currentTarget属性,其事件处理程序当前正在处理事件的那个元素(事件处理程序挂载的那个元素)。

在事件处理程序内部,this对象的值始终等于currentTarget的值。

target属性,事件的目标。

如果直接将事件处理程序指定给目标元素,则this、currentTarget、target的值相同。

比较下面两种情况:

示例1:

1 function showCurrentTarget(event) {
2     alert(event.currentTarget);    //object HTMLInputElement
3 };
4 event_util.addHandler(btn, "click", showCurrentTarget);
5
6 function showTarget(event) {
7     alert(event.target);    //object HTMLInputElement
8 };
9 event_util.addHandler(btn, "click", showTarget);

示例2:

1 function showCurrentTarget(event) {
2     alert(event.currentTarget);    //object HTMLBodyElement
3 };
4 event_util.addHandler(document.body, "click", showCurrentTarget);
5
6 function showTarget(event) {
7     alert(event.target);    //object HTMLInputElement
8 };
9 event_util.addHandler(document.body, "click", showTarget);

事件处理程序指定给了document.body,所以currentTarget属性的值为document.body;

而target却指向<input>元素,因为它才是我们click的目标;由于按钮上并没有事件处理处理程序,冒泡到body上,在这里事件才得到处理。

也就是说,点了按钮,target就是按钮,但是按钮上并没有绑定事件,然后冒泡,冒到body上,body上有事件,currentTarget为body。

eventPhase属性,可以用来确定事件当前正位于事件流的哪个阶段。

如果是在捕获阶段调用的事件处理程序,则eventPhase值为1;如果事件处理程序处于目标对象上,则eventPhase值为2;如果是在冒泡阶段调用的事件处理程序,则evenPhase值为3.

 1 btn.addEventListener("click", function(event) {
 2     alert(event.eventPhase);    //2
 3 }, true);
 4 btn.addEventListener("click", function(event) {
 5     alert(event.eventPhase);    //2
 6 }, false);
 7
 8 document.body.addEventListener("click", function(event) {
 9     alert(event.eventPhase);    //1
10 }, true);
11 document.body.addEventListener("click", function(event) {
12     alert(event.eventPhase);    //3
13 }, false);

事件的目标是按钮,所以按钮是处于目标阶段,不管以冒泡流还是捕获流,eventPhase值都是为2;当eventPhase值为2时,this、currentTarget和target是相等的。

对于document.body,当传入的参数为true,表示在捕获阶段调用事件处理程序,其evenPhase值为1;当传入的参数为false,表示在冒泡流调用的事件处理程序,其eventPhase值为3。

trusted属性,为true表示事件是浏览器生成的;为false表示事件是开发人员通过JS创建的(DOM3级事件中新增)。

1 function showMessage(event) {
2     alert("This is a button.");
3     alert(event.trusted);    //undefined
4 };
5 event_util.addHandler(btn, "click", showMessage);

event.trusted值为undefined,原因未明。

detail属性,与事件相关的细节信息;详情未知。

view属性,与事件关联的抽象视图;等同于发生事件的window对象;详情未知。

IE中的事件对象

要访问IE中的event对象有几种不同的方式,取决于指定事件处理程序的方法。

在使用DOM0级方法添加事件处理程序时,event对象作为window对象的的一个属性存在。

1 btn.onclick = function() {
2     var event = window.event;
3     alert(event.type);    //"click"
4 };

如果事件处理程序是通过attachEvent()添加的,那么就会有一个event对象作为参数传入事件处理程序中。

1 btn.attachEvent("onclick", function(event) {
2     alert(event.type);    //"click"
3 });

cancelBubble属性,默认值为false,将其设置为true,就可以阻止冒泡。

returnValue属性,默认值为true,将其设置为false,就可以取消事件的默认行为。

srcElement属性,事件的目标,与DOM中的target属性相同。

跨浏览器的事件对象

 1 var event_util = {
 2     //添加事件
 3     addHandler: function(element, type, handler) {
 4         if(element.addEventListener) {
 5             element.addEventListener(type, handler, false);
 6         } else if(element.attachEvent) {
 7             element.attachEvent("on" + type, handler);
 8         } else {
 9             element["on" + type] = handler;
10         }
11     },
12     //移除事件
13     removeHandler: function(element, type, handler) {
14         if(element.removeEventListener) {
15             element.removeEventListener(type, handler, false);
16         } else if(element.detachEvent) {
17             element.detachEvent("on" + type, handler);
18         } else {
19             element["on" + type] = null;
20         }
21     },
22     //获取事件对象
23     getEvent: function(event) {
24         return event ? event : window.event;
25     },
26     //获取事件目标
27     getTarget: function(event) {
28         return event.target || event.srcElement;
29     },
30     //阻止事件冒泡
31     stopPropagation: function(event) {
32         if(event.stopPropagation) {
33             event.stopPropagation();
34         } else {
35             event.cancelBubble = true;
36         }
37     },
38     //取消事件默认行为
39     preventDefault: function(event) {
40         if(event.preventDefault) {
41             event.preventDefault();
42         } else {
43             event.returnValue = false;
44         }
45     }
46 };
时间: 2024-08-24 12:39:17

JS 事件(3)——事件对象的相关文章

js中的事件,内置对象,正则表达式

[JS中的事件分类] 1.鼠标事件: click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup 2.键盘事件: keydown: 键盘按下去触发 keypress: 键盘按下并松开的瞬间触发 keyup: 键盘抬起时触发 [注意事项:(了解)] ① 执行顺序: keydown--keypress--keyup ② 长按时,会循环不断的执行keydown-keypress ③ 有keydown事件,不一定有keyup事件(事件触发过程

js中的事件 bom对象 dom对象.

3.事件 什么是事件?为什么使用事件? 我们学习事件首先了解一些概念 事件源 事件 监听器 事件源:事件的源头(也就是这个事件是由某某触发的,那么我们就管其叫事件源) 监听器:监听事件发生的组件.那么监听器要想监听事件是否发生,必须注册监听(绑定监听) js中常用的事件 1.onclick 鼠标点击某个对象 我们在开发中一般会对按钮,文本框或radio checkbox等进行onclick操作. 2.onblur 失去焦点 3.onfocus 获去焦点 4.onchange 改变域的内容 针对于

JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

   前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学,经过初步的学习,会对这一门语言有了一定深入的了解,也会感受到这一门语言的强大之处.希望各位同学通过一定的学习,会得到等大的收获. 因为是最后一篇所以内容可能有点多,希望各位同学能够慢慢看,细细看,让我们一起学习,一起进步,一起感受JS的魅力. 一函数 函数的声明及调用 1.函数的声明格式: func

js 函数 常用事件 document事件 window对象

js入口函数 window.onload=function(){ } 函数 定义 有一定功能代码体的集合.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 基本格式  function functionname(){执行代码 } 分类 基础函数 <script type="text/javascript"> function aa(){ alert("这是我的第一个函数"); } aa(); </script> 参数函数: fan

js事件处理、事件对象

事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html')"> </div> 点击div1之后弹出 append click event in html:其实在html结构中添加的事件也属于dom0级事件. 2 dom0级事件处理 <div id="div1"> </div> <scri

JS事件处理和事件对象

1.HTML事件处理 直接添加到html结构中处理程序属性 <body> <button onclick="demo()">按钮</button> <script> function demo(){ alert("html事件处理"); } </script> </body> 这种html事件处理有很大坏处是修改一处函数名称必须同时修改两处(onclick事件内容也要修改) 2.DOMO级事件处

JS事件-对象监视事件,事件触发函数

写在前面: 一句话作为本文的核心思想:对象监视事件,事件触发函数: (一)事件 1.事件分类 (1)鼠标事件 click()                      鼠标单击 dblclick()                   鼠标双击 mouseover()             鼠标移入事件 mouseout()              鼠标移出事件 mousemove()             鼠标移动事件 mousedown()            鼠标按下事件 mous

原生js自动触发事件

熟悉jquery的童鞋都知道在jq中有一个方法可以自动触发事件,那就是trigger(),那么通过原生js又怎么模拟触发呢? js中添加一个主动触发事件的方法有dispatch.该方法能模拟用户行为,如点击(click)操作等. 标准使用dispatchEvent方法,IE6/7/8则使用fireEvent方法. dispatchEvent() 方法给节点分派一个合成事件. 语法如下: dispatchEvent(eventObj) eventObj 参数是一个描述事件的 ActionScrip

js中的事件:

事件驱动: 1.事件:js捕获用户的操作或页面中的一些行为 2.事件源:触发事件的对象 鼠标事件: onclick ondblclick onmousedown onmouseup onmousemove onmouseover onmouseout 页面事件,撤销加载: onbeforeunload 添加,删除事件具有兼容性: 在IE中: 添加: obj.attachEvent("on事件","处理程序") 删除: obj.detachEvent("on

js高级技巧----自定义事件

自定义事件 原本的事件处理的原理:事件是javascript与浏览器交互的主要途径. 事件是一种叫做观察者的设计模式 观察者模式由两类对象组成:主体和观察者. 主体用于发布事件: 观察者通过订阅这些事件来观察该主体. 自定义事件的原理: 将事件处理程序保存在一个数组中: 当添加事件的时候,我们push进去这个事件处理函数: 当我们执行的时候,从头遍历这个数组中的每个事件处理函数,并执行. 自定义事件应该具有的内容: 1.一个handler对象,对象中保存着存放事件处理函数的数组 handler