事件类型分类:

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. iOS开发--应用崩溃日志揭秘(二)

    场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”崩溃日志如下: Incide ...

  2. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  3. Go 作用

    Go语句的作用是表示一个batch(多条Tsql命令)的结束,并向sql server 提交batch,由于局部变量的作用域是基于batch的,所以,go语句限制局部变量的作用域在一个batch中. ...

  4. JS 原型,检索,更新,引用等

    <script type="text/javascript"> var myObject=maker({ first:f, last:1, state:s, city: ...

  5. 搭建AngualarJS开发环境

    1.选择Web浏览器 Chrome和Firefox浏览器 2.选择代码编辑器 Subline Text和Visual Studio Code 3.安装Web服务器 3.1Apache HTTP Ser ...

  6. HBase 数据模型(Data Model)

    HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...

  7. MSIL Hello World

    最近由于需要,开始阅读 MSIL 方面的东西.我读的是<.NET 探秘——MSIL 权威指南>(<Expert .NET 2.0 IL Assembler>中译版).感觉没什么 ...

  8. Ajax跨域访问wcf服务中所遇到的问题总结。

    工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...

  9. 在IIS下部署Thinkphp项目,验证码不能显示的解决办法

    由于公司租用的是虚拟空间,而且用的是IIS服务器,所以部署PHP的时候就出现很多问题:比如昨天就碰到这个问题:在IIS下部署Thinkphp项目,验证码不能显示 这是生成验证码的方法: // 制作专门 ...

  10. CloudNotes之桌面客户端篇:增强的笔记列表

    今天,我发布了CloudNotes的一个更新版本:1.0.5484.36793.这个版本与1.0.5472.20097不同的是,它拥有增强的笔记列表,与之前单调的列表系统相比,新的笔记列表不仅可以显示 ...