事件类型分类:

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>
<script>
var dom1 = document.getElementById('div1');
dom1.onclick = function(){alert(' first dom0 ')};
dom1.onclick = function(){alert(' second dom0 ')};
</script>

点击div1之后只弹出 second dom0;说明dom0级事件后面赋值的事件会覆盖掉前面的

如果在div中在加 onclick="alert('append click event in html'), 代码如下:

<div id="div1" onclick="alert('append click event in html')"> </div>
<script>
var dom1 = document.getElementById('div1');
dom1.onclick = function(){alert(' first dom0 ')};
dom1.onclick = function(){alert(' second dom0 ')};
</script>

点击div后 仍然只弹出second dom0, 说明在html中添加的点击事件处理程序也被覆盖。

实际上 dom1.onclick 等价于html结构中div标签中的onclick=""; 可以把onclick看成dom元素对象的一个属性 dom1{ id:"1", onclick:function(){ ... } }

3 dom2级事件处理

dom.addEventListener(“事件名”,“事件处理程序”,“布尔值”)

布尔值表示该事件的响应顺序,默认值为false。

true:事件捕获:表示在捕获阶段调用事件处理程序。
false:事件冒泡:表示在冒泡阶段调用事件处理程序。
事件传递有两种方式:冒泡与捕获。
事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素, 哪个元素的 "click" 事件先被触发呢?
在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。
在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。
 
关于事件冒泡和捕获在后面再举出实例代码。
使用addEventListener添加事件不会被覆盖也不会覆盖dom0级事件,如下:
<div id="div1" onclick="alert('append click event in html')"> </div>
<script>
var dom1 = document.getElementById('div1');
var handle = function () {
alert('dom2 event handle');
};
dom1.onclick = function(){alert(' first dom0 ')};
dom1.onclick = function(){alert(' second dom0 ')};
dom1.addEventListener("click", function(){alert(' first dom2 ')}, false);
dom1.addEventListener("click", handle, false);
</script>
点击div1时弹出 second dom0、first dom2 、dom2 event handle ,dom0级绑定的最后一个事件覆盖了前面所有的dom0级事件,而绑定的两个dom2级事件都存在,并且先执行dom0级事件在执行dom2级事件。
 
使用removeEventListener移除事件,传入的参数与添加处理程序时addEventListener使用的参数相同。
这也意味着事件处理程序为匿名函数的无法移除,如下所示:
<div> </div>
<script>
var dom1 = document.getElementById('div1');
var handle = function () {
alert('event handle');
};
dom1.addEventListener("click", function(){alert(' first dom2 ')}, false);
dom1.addEventListener("click", function(){alert(' second dom2 ')}, false);
dom1.addEventListener("click", handle, false);
dom1.removeEventListener("click", handle, false);
dom1.removeEventListener("click", function(){alert(' second dom2 ')}, false);
</script>

点击div1依次弹出 first dom2 、second dom2

关于事件冒泡和捕获的代码实例:

<div id="div1"><div id="div2"><div id="div3"><div id="div4"></div></div></div></div>
<script>
var html = document.getElementsByTagName('html')[0];
var body = document.getElementsByTagName('body')[0];
var dom1 = document.getElementById('div1');
var dom2 = document.getElementById('div2');
var dom3 = document.getElementById('div3');
var dom4 = document.getElementById('div4');
window.addEventListener("click", function(){alert('window')}, false);
document.addEventListener("click", function(){alert('document')}, true);
html.addEventListener("click", function(){alert('html')}, false);
body.addEventListener("click", function(){alert('body')}, true);
dom1.addEventListener("click", function(){alert('div1')}, false);
dom2.addEventListener("click", function(){alert('div2')}, true);
dom3.addEventListener("click", function(){alert('div3')}, false);
dom4.addEventListener("click", function(){alert('div4')}, false);
// addEventListen 添加的第三个参数true则是事件捕获,不添加或false则为事件冒泡, 由事件源dom4元素 --> 父元素dom3 --> 爷爷元素dom2 --> ... --> body --> html --> document --> window 执行事件处理程序
// 若从事件源dom4元素到window 有存在事件捕获的绑定事件 ,则事件从window到事件源dom4 依次执行完设置为true的捕获事件 在从事件源dom到window执行完其他未设置为true的冒泡事件。
//如上述代码 依次弹出 document body div2 div4 div3 div1 html window
</script>

注意:IE8及更早IE版本,Opera7.0及其更早版本不支持 addEventListener() 和 removeEventListener() 方法。

对于这类浏览器版本可以使用 attachEvent() 方法来添加事件,detachEvent() 方法来移除事件句柄

 
事件对象:在触发dom事件的时候都会产生一个事件对象
 
事件对象event:
1) type:获取事件类型
2) target:获取事件目标
3) stopPropagation():阻止事件冒泡
4) preventDefault():阻止事件默认行为
<div id="div1"> </div>
<script>
var dom1 = document.getElementById('div1');
dom1.addEventListener("click",function(event){console.log(event.type);console.log(event.target)})
</script>
 console.log 输出: click , <div id="div1"> </div>
<div><a></a></div>
<script>
dom_div.addEventListener("click",fun_div)
dom_a.addEventListener("click",fun_a)
</script>
点击a时触发fun_a 由于事件冒泡再触发fun_div  
在fun_a的末尾添加event.stopPropagation():阻止事件冒泡 则div中的click事件fun_div无效
 
<a href="http://www.baidu.com"></a>
dom_1.addEventListener("click",function(event){}) 点击之后a会跳转到百度 在回调函数function中添加event.preventDefault();阻止事件默认行为 点击之后不会跳转
 

js事件处理、事件对象的更多相关文章

  1. js event事件对象概括

    事件是用户或者浏览器自身执行的动作,而响应某个事件的函数就叫做事件处理程序或者叫事件侦听器. 定义事件处理程序可以大致分为以下三种: 一.html事件处理程序 元素支持的每种事件都可以用一个与之对应的 ...

  2. JS键盘事件对象之keyCode、charCode、which属性对比

    先说一些有关键盘事件的事项:用js实现键盘记录,要关注浏览器的三种按键事件类型,即keydown,keypress和keyup,它们分别对应onkeydown. onkeypress和onkeyup这 ...

  3. Js高级 事件 对象

    1.事件 浏览器客户端上客户触发的行为都成为事件 所有的事件都是天生自带的,不需要我们我去绑定,只需要我们去触发. 通过obj.事件名=function(){} 事件名:onmouseover onm ...

  4. js函数事件对象

    每个函数都有4个默认对象 arguments 保存着实际传入的参数,集合列表 return 有两个功能,打断函数和返回函数值 this 谁调用的函数,this就是谁 event 事件对象 事件 box ...

  5. 2-4 js基础-事件对象小结

    var e=ev||event; e.cancelBubble=true; document.documentElement   html document.body                  ...

  6. JS 事件对象和事件冒泡

    1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象的获取方法: IE中可以window.event直接获取,而Firefox ...

  7. 和我一起理解js中的事件对象

    我们知道在JS中常用的事件有: 页面事件:load: 焦点事件:focus,blur: 鼠标事件:click,mouseout,mouseover,mousemove等: 键盘事件:keydown,k ...

  8. Javascript和jquery事件--事件对象event

    1.  事件对象event 对于event,js的解释是Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.而jq的解释是事件处理(事件对象.目标元素 ...

  9. JavaScript基础回顾知识点记录6-操作元素样式和事件对象(介绍基本使用)

    js 中 操作元素样式 通过js修改元素内联样式(设置和读取的都是内联样式) 获取当前元素显示的样式 <html> <head> <meta charset=" ...

  10. JS事件流、DOM事件流、IE事件处理、跨浏览器事件处理、事件对象与类型

    事件的移除 removeEventListener() 第二个参数需要指定要移除的事件句柄,不能是匿名函数,因为无法识别 想要移除成功,那么三个参数必须跟addEventListener中的三个完全一 ...

随机推荐

  1. angularjs 2.0 快速开始

    前言 angularjs2.0 如果发布,公司的项目会基于2.0开发,在1.0的时候就踩了好多坑,趁这2.0还没正式发布,赶紧踩下坑. 这篇文章是参考angularjs2.0 官方文档写的,开发环境需 ...

  2. ElasticSearch ik分词安装

    1.下载对应版本的ES ik分词 https://github.com/medcl/elasticsearch-analysis-ik/releases 2.解压elasticsearch-analy ...

  3. 关于如何在github上创建团队开发环境

    今天想写个如何在github上创建团队开发环境的博客.送给那些还不知道如何在github上创建团队开发环境的开发人员. 1.首先,当然你要有个github的账号.具体怎么注册我这里就不说了.可以上gi ...

  4. DAC Usage4:从 Backup Package(.bacpac)还原DB

    使用DAC,能够将database的schema 和 data 从一个server 或 cloud 上复制到另外一个server上,存储schema 和 data的文件是 .bacpac 文件. 方法 ...

  5. Logical read, Physical read (SET STATISTICS IO)

    在查询性能优化时,Logical Read非常重要,它的计数一般与查询出来的结果集数量成正比,与数据读取的速度也成正比. 1,SET STATISTICS IO 显式Disk IO的信息 Syntax ...

  6. WPF如何仿制QQ2013登录窗口的关闭效果

    昨天,有位朋友问我,WPF能做出像QQ2013窗口在关闭时那个貌似透明过渡的动画吗?我就歪着脸跟他说:"只有你想不到的,没有WPF做不到的". 他又接着说:"我知道肯定会 ...

  7. Huffman树进行编码和译码

    //编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  8. Neutron 功能概述 - 每天5分钟玩转 OpenStack(65)

    从今天开始,我们将学习 OpenStack 的 Networking Service,Neutron.Neutron 的难度会比前面所有模块都大一些,内容也多一些.为了帮助大家更好的掌握 Neutor ...

  9. TextView+Fragment实现底部导航栏

    前言:项目第二版刚上线没多久,产品又对需求进行了大改动,以前用的是左滑菜单,现在又要换成底部导航栏,于是今天又苦逼加班了.花了几个小时实现了一个底部导航栏的demo,然后总结一下.写一篇博客.供自己以 ...

  10. MySQL学习笔记九:存储过程,存储函数,触发器

    存储过程 1.存储过程由一组特定功能的SQL语句组成,对于大型应用程序优势较大,相对不使用存储过程,具有以下优点: a.性能提高,因为存储过程是预编译的,只需编译一次,以后调用就不须再编译 b.重用性 ...