JavaScript事件处理的方式(三种)


Posted in Javascript onApril 26, 2016

最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小部分,有时用的时候也比较混乱,现在系统的整理了一下,特此分享到三水点靠木平台供大家参考下!

一、什么是JavaScript事件?

事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。

事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是Web浏览器中发生的事情,比如说某个Web页面加载完成,或者是用户滚动窗口或改变窗口大小。说白了,事件是文档或浏览器中发生的特定交互瞬间!

通过使用JavaScript,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应。

二、事件流

事件流就是描述了页面中接受事件的顺序,在浏览器发展的初期,两大浏览器厂商IE和Netscape互掐,出现了一个坑爹的情况,那就是他们对事件流的解释出现了两中截然相反的定义。也就是我们所熟悉的:IE的事件冒泡,Netscape的事件捕获。先来一张图,简要的看下结构:

JavaScript事件处理的方式(三种)

1、事件冒泡

事件冒泡即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的节点(文档)。拿上面的图来说明,就是当点击text部分时,先由text处的元素接收,然后逐级传播至window,即执行6-7-8-9-10的过程。

2、事件捕获

事件捕获即事件最早由不太具体的节点接收,而最具体的节点最后接收到事件。同理,在上面的模型中,就是点击text部分时,先由window接收,然后逐级传播至text元素,即执行1-2-3-4-5的过程。

具体在代码中怎样表现呢?后面给出!

三、Javascript事件处理程序的3种方式

产生了事件,我们就要去处理他,Javascript事件处理程序主要有3种方式:

1、HTML事件处理程序

即我们直接在HTML代码中添加事件处理程序,如下面这段代码:

<input id="btn" value="按钮" type="button" onclick="showmsg();">
<script>

 function showmsg(){

 alert("HTML添加事件处理");

 }

</script>

从上面的代码中我们可以看出,事件处理是直接嵌套在元素里头的,这样有一个毛病:就是html代码和js的耦合性太强,如果哪一天想要改变js中showmsg,那么不但要再js中修改,还需要到html中修改,一两处的修改我们能接受,但是当你的代码达到万行级别的时候,修改起来就需要劳民伤财了,所以,这个方式我们并不推荐使用。

2、DOM0级事件处理程序

即为指定对象添加事件处理,看下面的一段代码:

<input id="btn" value="按钮" type="button">
<script>


var btn= document.getElementById("btn");

 btn.onclick=function(){



alert("DOM级添加事件处理");


} 


btn.onclick=null;//如果想要删除btn的点击事件,将其置为null即可

</script>

从上面的代码中,我们能看出,相对于HTML事件处理程序,DOM0级事件,html代码和js代码的耦合性已经大大降低。但是,聪明的程序员还是不太满足,期望寻找更简便的处理方式,下面来看第三种处理方法。

3、DOM2级事件处理程序

DOM2也是对特定的对象添加事件处理程序,但是主要涉及到两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和 removeEventListener()。它们都接收三个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值(是否在捕获阶段处理事件),看下面的一段代码:

<input id="btn" value="按钮" type="button">
<script>

 var btn=document.getElementById("btn");

 btn.addEventListener("click",showmsg,false);//这里我们把最后一个值置为false,即不在捕获阶段处理,一般来说冒泡处
理在各浏览器中兼容性较好

 function showmsg(){

 alert("DOM级添加事件处理程序");

 }

 btn.removeEventListener("click",showmsg,false);//如果想要把这个事件删除,只需要传入同样的参数即可

</script>

这里我们可以看到,在添加删除事件处理的时候,最后一种方法更直接,也最简便。但是马海祥提醒大家需要注意的是,在删除事件处理的时候,传入的参数一定要跟之前的参数一致,否则删除会失效!

四、事件冒泡和事件捕获的流程与区别

说到这里,再给大家来一点代码来说明下事件冒泡和事件捕获的流程,同时也让大家能看出二者的区别:

<!doctype html>
<html lang="en">

<head>

 <meta charset="UTF-">

 <title>Document</title>

 <style>

 #p{width:px;height:px;border:px solid black;}

 #c{width:px;height:px;border:px solid red;}

 </style>

</head>

<body>

 <div id="p">

 i am www.mahaixiang.cn

 <div id="c">i like www.mahaixiang.cn</div>

 </div>

 <script>

 var p = document.getElementById('p');

 
var c = document.getElementById('c');

 c.addEventListener('click', function () {

 alert('子节点捕获')

 }, true);

 c.addEventListener('click', function () {

 alert('子节点冒泡')

 }, false);

 p.addEventListener('click', function () {

 alert('父节点捕获')

 }, true);

 p.addEventListener('click', function () {

 alert('父节点冒泡')

 }, false);

 </script>

</body>
</html>

运行上面的代码,点击子元素的时候,我们会发现,执行的先后顺序是:父节点捕获--子节点捕获--子节点冒泡--父节点冒泡。从这个例子中,大家也就明白了,另外,DOM2级事件规定事件包括三个阶段:

1、事件捕获阶段;

2、处于目标阶段;

3、事件冒泡阶段。

首先是捕获,然后处于目标阶段(即来到事件的发出位置),最后才是冒泡,不科学的是,居然木有DOM1级事件处理程序,大家注意下,别闹出笑话了!

五、补充

1. IE事件处理程序也对应有两个方法:attachEvent()添加事件,detachEvent()删除事件,这两个方法接收相同的两个参数:事件处理程序名称与事处理函数。这里为什么没有布尔值呢?因为ie8以及更早的版本只支持事件冒泡,所以最后一个参数默认的相当于false来处理!(支持IE事件处理程序的浏览器有IE,opera)。

2. 事件对象是用来记录一些事件发生时的相关信息的对象,但事件对象只有事件发生时才会产生,并且只能是事件处理函数内部访问,在所有事件处理函数运行结束后,事件对象就被销毁!

以上所述是小编给大家介绍的JavaScript事件处理的方式(三种),希望对大家有所帮助!

Javascript 相关文章推荐
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
javascript创建数组之联合数组的使用方法示例
Dec 26 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 Javascript
Jquery选择器中使用变量实现动态选择例子
Jul 25 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
javascript十六进制及二进制转化的方法
May 06 Javascript
基于JS实现的笛卡尔乘积之商品发布
May 13 Javascript
详解如何去除vue项目中的#——History模式
Oct 13 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
vue 手机物理监听键+退出提示代码
Sep 09 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 #Javascript
jQuery siblings()用法实例详解
Apr 26 #Javascript
JQuery插件Marquee.js实现无缝滚动效果
Apr 26 #Javascript
Angular.js回顾ng-app和ng-model使用技巧
Apr 26 #Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 #Javascript
Bootstrap网格系统详解
Apr 26 #Javascript
Bootstrap每天必学之标签页(Tab)插件
Aug 09 #Javascript
You might like
建立文件交换功能的脚本(一)
2006/10/09 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
php 过滤器实现代码
2010/08/09 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
详解js的六大数据类型
2016/12/27 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python新手学习可变和不可变对象
2020/06/11 Python
白岩松演讲
2014/05/21 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
图书馆义工感想
2015/08/07 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server