事件类型分类:

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标签中的οnclick=""; 可以把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();阻止事件默认行为 点击之后不会跳转
 

转载于:https://www.cnblogs.com/peakleo/p/6090385.html

js事件处理、事件对象相关推荐

  1. JS的事件对象和事件冒泡

    2019独角兽企业重金招聘Python工程师标准>>> 1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象 ...

  2. js中事件对象event

    一.Event对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! 当一个事件发生的时候, ...

  3. js中事件对象event的兼容性问题

    W3C标准规定,事件是作为函数的参数传入的,例如: <p id="demo">点击我将获得屏幕坐标</p> document.getElementById( ...

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

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

  5. Vue.js:vue指令(给标签属性赋Vue变量v-bind,绑定事件 v-on)vue事件处理函数中, 拿到事件对象,6个事件修饰符

    1. 给标签属性赋Vue变量v-bind 在vue中,v-bind指令可以动态的给标签的属性设置值, 语法:v-bind:属性名="vue变量" 简写::属性名="vue ...

  6. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  7. 06 事件处理函数绑定与事件对象

    事件处理函数绑定 DOM事件处理 addEventListener or onclick = function(){} 纯小写 React元素也采用了类似DOM0标准中的事件属性定义的方法 小驼峰 J ...

  8. jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例

    day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...

  9. JS详解 | 对象 事件 节点 | 系统性学习 | 无知的我费曼笔记

    无知的我正在复盘js- 文章目录 JavaScript 1 常用命令 输出语句 转换为字符串 得到变量类型 1 获取元素对象 1.1 H5新增获取元素对象 1.2 直接获取特殊元素对象 2 事件三要素 ...

最新文章

  1. 25Interpreter(解析器)模式
  2. 源码阅读:AFNetworking(八)——AFAutoPurgingImageCache
  3. GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue
  4. 什么是Github的元数据metadata以及如何备份github上的数据
  5. oracle 采购 日历,Oracle日历程序
  6. poi数据导入arcgis,结合POI数据的道路自动选取方法
  7. 异步数据加载和Tab选项卡
  8. 修改Linux系统默认编辑器
  9. 【Codeforces Round #555 (Div. 3) G】Inverse of Rows and Columns【bitset优化暴力...】
  10. 批处理 文件名字前面加前缀或者后缀
  11. Mastermind游戏
  12. 最优服务次序问题 水 NOJ1254
  13. 在SVG中旋转图形,需要设置各个图形的旋转中心点
  14. 弹性云服务器(Elastic Cloud Server,ECS)
  15. 深度分析:区块链技术未来发展的 8 个趋势
  16. Hive——hive安装
  17. linux下查大文件的方法
  18. google离线地图实例,加载本地地图瓦片, 支持点线面及图文标注,坐标定位,卫星、电子地图切换
  19. 三款过CE/FCC/SRCC认证USB接口双频WIFI模块
  20. Thinkphp 5.0 购物网站

热门文章

  1. Devexpress VCL Build v2014 vol 14.1.4 发布
  2. Eclipse3.6.2 64位启动报“Failed to load the JNI shared library”错的解决方法
  3. 在多种浏览器中嵌入Applet
  4. [mmdetection] - win10配置mmdetection(1.1和2.0) + 训练网络(faster-rcnn、mask-rcnn)
  5. 瓜子二手车发12月二手车价格:汉兰达奥德赛CR-V保值率居首
  6. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
  7. Ubuntu 18.04换国内源
  8. 深入理解javascript函数进阶系列第一篇——高阶函数
  9. nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
  10. Windows Server 2008设置远程桌面连接的最大数量