热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript之事件对象Event(事件)

事件事件:用户与浏览器特定的交互瞬间。事件对象在触发DOM上的事件时,会产生一个事件对象Event,它包含了与事件相关的所有信息。如:事件的类型、导致事件的元素(当前元素)、以及其它与事件相关的信息。
事件 事件:用户与浏览器特定的交互瞬间。

事件对象

在触发DOM上的事件时,会产生一个事件对象Event,它包含了与事件相关的所有信息。如:事件的类型、导致事件的元素(当前元素)、以及其它与事件相关的信息。如鼠标操作事件中,包含了鼠标的位置。键盘操作事件中,包含了是否敲击了键盘等。

DOM中的事件对象


兼容DOM的浏览器会将 事件对象Event 传入事件处理程序中,无论指定事件处理程序的方式是什么(DOM 0级、DOM 2级或HTML特性)。







弹出事件的类型为"click"事件。


对于HTML特性指定的事件处理程序




在事件处理程序内部,对象this始终等于currentTarget(当前正在处理事件的那个元素),而target表示实际目标(即当前元素)。
当事件处理程序直接指定给input按钮时,





这个例子是直接将事件处理程序指定给了当前元素(即input)。因此this、target、currentTarget这三个值是相等的。


如果事件处理程序在按钮的父节点(如:document.body)中:
第一种情况,当我们直接点击按钮时,

 
 


效果:


我们可以看到,当直接点击按钮时,就会在input按钮和document.body上均触发onclick事件。当将事件处理程序指定给input按钮时,currentTarget、this、target的值都是当前元素(input按钮),处理事件的就是input按钮,事件的真正目标是input按钮。当将事件处理程序指定给其document.body时,this === currentTarget,此时处理事件的是document.body,而这个事件的真正目标还是input按钮。

第二种情况,当我们点击input按钮即点击body内部时:效果就不一样了


撑开body

撑开body




效果:



此时,我们可以看到,当点击body内部除input按钮之外的地方时,就会在document.body上触发事件,此时,this===currentTarget===document.body,处理事件的是document.body,注,此时事件的真正目标就是document.body,因为按钮没有触发事件,即e.target===document.body。



有时需要一个函数处理多个事件,因此可以利用 开关语句 为其添加事件。
var input1 = document.getElementById("input1");

var event = function (e) {
switch (e.type) {
case "click":
alert("clicked");
break;
case "mouseover":
e.target.style.color = "red"; //当前元素的颜色变成红色
breadk;
case "mouseout":
e.target.style.color = "blue";
}
};

input1.oclick = event;
input1.mouseover = event;
input1.mouseout = event;


先要判断事件的类型,再执行相应操作。



想要阻止事件的默认行为,可以使用preventDefult()方法来取消事件的默认行为。如:超链接,点击超链接时,会默认跳转到指定的ULR页面。可以用perventDefult()来取消这种行为。
var a1 = document.getElementById("a1");

a1.Onclick= function (e) {
e.preventDefult(); //阻止了a元素默认的跳转行为,点出不会跳转
};


当然,只有cancelable属性的值为true的情况下,才能使用preventDefult()来取消默认的行为。



stopPropagation()停止事件在DOM层次中传播,也就是取消进一步事件捕获或冒泡。
var a1 = document.getElementById("a1");

a1.Onclick= function (e) {
alert("hi");
e.stopProPagation(); //取消事件继续在DOM层次中传播
};
//取消了传播,下列代码不会执行
document.body.Onclick= function (e) {
alert("HI");
};

本来要出现两个警告框的,但通过stopPropagation()已经取消了事件继续在DOM层次中传播,onlcick事件也就不会传播(冒泡)到document.body这里来,因此不会触发注册到document.body上的事件处理程序了,document,body也就不会处理事件了。



eventPhase属性来确定当前事件在哪个阶段了,返回1表示处于捕获阶段,返回2表示事件处理程序处于目标对象上,返回3表示处于冒泡阶段。虽然“处于目标”发生在冒泡阶段,但会返回2。


撑开body

撑开body




效果:


从这个例子中,我们发现,当我们点出按钮时,会触发事件的三个阶段,即第一阶段捕获阶段,第二阶段事件处于目标上,第三阶段冒泡阶段。但当我们点出body内部除了按钮之外的地方时,只会触发事件的二个阶段,分别是第一阶段捕获阶段,第三阶段冒泡阶段,这是因为此时没有点出按钮,那么按钮就不会触发事件处理程序,触发事件的是document.body,也就是说document.body在处理事件,即target===this==currentTarget===document.body。


IE中的事件对象

与访问DOM中的event对象不同的是,IE中访问event对象取决于指定 事件处理程序 的方式(DOM 0级、IE特有的、HTML特性)。在IE中,event对象是未定义的,也就是undefined,返回的是window.event。
使用DOM 0级指定事件处理程序时,event对象是作为window对象的属性来看的。
var input1 = document.getElementById("input1");

input1.Onclick= function () { //
var event = window.event; //全局对象的属性,所以不用传递参数。
alert(event.type); //click
};

可以这样理解:IE中的window.event相当于DOM中的event。且DOM 0级中,IE无需传入event作为参数。


而对于用attachEvent()方法指定事件处理程序,将event对象作为参数传入事件处理函数。
var input1 = document.getElementById("input1");

input1.attachEvent("onclick", function (event) { //传入参数
alert(event.type); //click
});

用这种方法指定事件处理程序,与在DOM中用addEventListener()指定一样,将event对象作为参数传入事件处理函数。


用HTML特性指定事件处理程序,可以通过event变量来访问event对象(与在DOM中用HTML特性指定一样)。



在IE中,用srcElement来表示事件的目标(与DOM中target一样)。
var input1 = document.getElementById("input1");

//DOM 0级方式
input1.Onclick= function () { //在IE中使用DOM 0级,无需传入参数
alert(window.event.srcElement === this); //true
};

在前面已经提过:在IE中通过attachEvent()添加事件,事件处理程序是在全局作用域运行的,也就是this对象指向window对象,属于全局对象
var inpt1 = document.querySelector("#inpt1");
inpt1.attachEvent("onclick", function (e) {
alert(e.srcElement == this); //false 此时this对象指向window对象,事件目标日显不是全局对象。
});

通过attachEvent()方法添加事件,this属于全局对象,指向widow了,不再指向当前元素(inpt1)了,那么srcElement事件目标指向的不是this了,而应该是当前元素(inpt1):
var inpt1 = document.querySelector("#inpt1");
inpt1.attachEvent("onclick", function (e) {
alert(e.srcElement == inpt1); //true
});




在IE中,用returnValue来阻止事件的默认行为。与DOM中的perventDefult()方法一样的效果。不过,returnValue要赋值false才有效果。
var input1 = document.getElementById("input1");

//DOM 0级方式
input1.Onclick= function () {
window.event.returnValue = false; //阻止IE中事件的默认行为
};


在IE中,用canceBubble来停止事件在DOM层次中继续传播。与DOM中的stopPropagation()方法一样的效果。不过,要给canceBubble赋值true才有效果。
当然,IE中只有事件冒泡,所以就是停止事件冒泡的继续传播。
var input1 = document.getElementById("input1");

//事件处于目标上阶段
input1.Onclick= function () {
alert("hi");
window.event.canceBubble = true; //停止事件在DOM层次中继续传播,也就是停止事件冒泡。
};
//事件冒泡阶段
document.body.Onclick= function () {
alert("HI");
};

本来要出现两个警告框的,但通过canceBubble已经取消了事件继续在DOM层次中传播,所以,也就不会传播到document.body这是来了。停止通过冒泡触发document.body中注册的事件处理程序。


跨浏览器的事件对象(event)

IE中的event与DOM的event不同,但IE中event对象的全部信息和方法在DOM中也有,所以可以根据它们的相似性做跨浏览器的方法来。将前面提到的EventUtil对象加强即可。
加强后的EventUtil对象:
var EventUtil = {
//添加事件句柄
addHandler : function (element, type, handler) {

//DOM 2级事件处理程序
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) { // IE事件处理程序
element.attachEvent("on" + type, handler);
} else {

//将当前元素看作对象,引用事件处理程序这个属性
element["on" + type] = handler; // DOM 0级事件处理程序
}
},

//获取event对象
getEvent : function (event) {
//利用条件赋值操作符来确定event,如果支持event,则返回DOM中event对象,如果不支持则返回IE中的event对象
return event ? event : window.event
},
//定义getDefult方法,用于阻止事件的默认行为
getDefult : function (event) {
if (event.preventDefult) {
event.preventDefult();
} else {
window.event.returnValue = false;
}
},
//定义getTarget方法,用于获取实际目标
getTarget : function (event) {
return event.target || event.srcElement;
}



//这是删除事件
removeHandler : function (element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent("on" + type, handler);
} else {
element["on" + type] = null; //DOM 0级删除事件赋值null给事件处理程序名即可。
}
},
//定义stopPropagation方法,用于停止事件继续向DOM层次传播
stopPropagaton : function (event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.canceBubble = true;
}
}
};


在兼容DOM的浏览器中,返回事件对象Event
var input1 = document.getElementById("input1");

input1.Onclick= function (event) {
event = EventUtil.getEvent(event); //这里返回的是event.
};


在IE中,event是未定义的,也就是undefined,返回的是window.event.
var input1 = document.getElementById("input1");

input1.Onclick= function () {
event = EventUtil.getEvent(event); //这里返回的是window.event
};


返回事件目标。
var input1 = document.getElementById("input1");

input1.Onclick= function (event) {
var target = EventUtil.getTarget(event);
};


想要返回什么,就可以用EventUtil对象调用其属性即可。是得到event对象,还是阻止默认行为,或者是停止事件的传播均可。


关于Event对象,再多说一句:
在兼容DOM中的Event参数,只是简单地传入和返回;而在IE中的Event参数是未定义的,也就是undefined,返回的是window.event。



推荐阅读
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
author-avatar
约醉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有