7.事件深入

7.1.事件捕获

事件流分为事件冒泡和事件捕获两种,事件冒泡指事件从里往外传播,而事件捕获刚好相反,指事件从外向內传播

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. #box1{
  10. width: 600px;
  11. height: 400px;
  12. background-color: black;
  13. margin: 100px auto;
  14. border: 1px solid
  15. }
  16. #box2{
  17. width: 400px;
  18. height: 200px;
  19. margin: 100px auto;
  20. background-color: orangered;
  21. border: 1px solid
  22. }
  23. #box3{
  24. width: 200px;
  25. height: 100px;
  26. margin: 50px auto;
  27. background-color: #009f95
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div id="box1">
  33. <div id="box2">
  34. <div id="box3"></div>
  35. </div>
  36. </div>
  37. <script>
  38. var oBox1 = document.getElementById("box1")
  39. var oBox2 = document.getElementById("box2")
  40. var oBox3 = document.getElementById("box3")
  41. function fn(){
  42. alert(this.id)
  43. }
  44. oBox1.onclick = fn;
  45. oBox2.onclick = fn;
  46. oBox3.onclick = fn;
  47. // 事件绑定的另外一种形式
  48. // addEventListener 第一个参数是 事件名称,第二个参数是事件处理函数,第三个参数表示 是否捕获
  49. // true表示捕获 false表示不捕获,捕获就是冒泡
  50. // 下面是事件冒泡的写法
  51. // oBox1.addEventListener('click',fn,false)
  52. // oBox2.addEventListener('click',fn,false)
  53. // oBox3.addEventListener('click',fn,false)
  54. // 下面是事件捕获的写法
  55. oBox1.addEventListener('click',fn,true)
  56. oBox2.addEventListener('click',fn,true)
  57. oBox3.addEventListener('click',fn,true)
  58. </script>
  59. </body>
  60. </html>

7.2.事件绑定形式总结

第一种写法,直接绑定在元素身上

  1. <div id="box" onclick="fn(this)"></div>
  2. <script>
  3. function fn(obj){
  4. alert(obj.id)
  5. }
  6. </script>

第二种写法 对象.事件 = 事件处理函数

  1. <div id="box" ></div>
  2. <script>
  3. var oBox = document.getElementById("box")
  4. oBox.onclick = function(){
  5. alert(this.id)
  6. }
  7. </script>

注意: 这种写法有个问题就是,如果同时绑定两个事件处理函数,后面的会把前面的覆盖,例如:

  1. <div id="box" ></div>
  2. <script>
  3. var oBox = document.getElementById("box")
  4. oBox.onclick = function(){
  5. alert(this.id)
  6. }
  7. oBox.onclick = function(){
  8. alert("nodeing.com")
  9. }
  10. </script>

第三种写法:addEventListener

  1. <div id="box" ></div>
  2. <script>
  3. var oBox = document.getElementById("box")
  4. oBox.addEventListener("click", function(){
  5. alert(this.id)
  6. }, false)
  7. oBox.addEventListener('click', function(){
  8. alert("nodeing.com")
  9. }, false)
  10. </script>

注意:这种写法在ie上有兼容性问题,因此,可以封装一个兼容性处理函数

  1. function addEvent(obj, type, fn){
  2. if(obj.addEventListener){
  3. obj.addEventListener(type, fn, false);
  4. } else if(obj.attachEvent){
  5. obj.attachEvent('on' + type, fn);
  6. } else {
  7. obj['on' + type] = fn;
  8. }
  9. }

7.3.事件取消

  1. function removeEvent(obj, type, fn){
  2. if(obj.removeEventListener){
  3. obj.removeEventListener(type, fn, false);
  4. } else if(obj.detachEvent){
  5. obj.detachEvent('on' + type, fn);
  6. } else {
  7. obj['on' + type] = null;
  8. }
  9. }

7.4.事件默认行为

如果是通过 对象.onclick = fn 这种形式来绑定的, 可以直接在事件处理函数中return false来取消

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. #box{
  10. height: 200px;
  11. width: 100px;
  12. background-color: orangered;
  13. position: absolute;
  14. display: none
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="box" ></div>
  20. <script>
  21. var oBox = document.getElementById("box")
  22. document.oncontextmenu = function(ev){
  23. var ev = ev || event
  24. oBox.style.display = "block"
  25. oBox.style.left = ev.clientX + "px"
  26. oBox.style.top = ev.clientY + "px"
  27. // 取消事件默认行为
  28. return false
  29. }
  30. document.onclick = function(){
  31. oBox.style.display = "none"
  32. }
  33. </script>
  34. </body>
  35. </html>

如果是通过addEventListener这种形式来绑定的,需要通过 ev.preventDefault()这种形式来取消

  1. document.addEventListener("contextmenu", function(ev){
  2. var ev = ev || event
  3. oBox.style.display = "block"
  4. oBox.style.left = ev.clientX + "px"
  5. oBox.style.top = ev.clientY + "px"
  6. // return false
  7. ev.preventDefault()
  8. }, false)

螺钉课堂视频课程地址:http://edu.nodeing.com

DOM-BOM-EVENT(7)的更多相关文章

  1. BOM基础(四)

    最近写的文章感觉内容不像之前那么充实,内容可能也有点杂.对于DOM,和BOM来说,要理解是不难的,难的是做的时候.要自己想的到,而且,对于目前阶段来说,BOM还存在着很大的兼容性问题,最主要就是要兼容 ...

  2. DOM 事件深入浅出(二)

    在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...

  3. JavaScript DOM动态创建(声明)Object元素

    http://www.cnblogs.com/GuominQiu/archive/2011/04/01/2002783.html 一文提及“等整个页面加载完毕后,根据用户所选的阅读机类型,再用Java ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. c#中的delegate(委托)和event(事件)

    c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...

  6. js的DOM操作整理(整理)

    js的DOM操作整理(整理) 一.总结 一句话总结: dom操作有用原生js的dom操作,也可以用对js封装过的jquery等插件来更加方便的进行dom操作 1.dom是什么? 对于JavaScrip ...

  7. DOM学习笔记(二)对象方法与属性

    所有 HTML 元素被定义为对象,而编程接口(对象的访问)则是对象方法和对象属性. 事实上,常用的只用window对象及其子对象document对象,以及事件Event对象. Window 对象 Wi ...

  8. DOM之事件(一)

    DOM事件,就是浏览器或用户针对页面可以做出的某种动作,我们称这些动作为DOM事件.它是用户和页面交互的核心.当动作发生(事件触发)时,我们可以为其绑定一个或多个事件处理程序(函数),来完成我们想要实 ...

  9. DOM的概念(1)

    什么是DOM? 通过 JavaScript,您可以重构整个HTML文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript就需要对HTML文档中所有元素进行访问的入口 ...

  10. JavaScript DOM学习总结(一)

    DOM 什么是DOM?简单地说DOM是一套对文档内容进行抽象和概念化的方法.   W3C给出的DOM定义是这样的:"一个与系统平台和编程语言无关的接口,程序和脚本以通过这个接口动态的访问和修 ...

随机推荐

  1. Rocket - config - Keys & Params

    https://mp.weixin.qq.com/s/Y42EWrO7IoHRD_yHD4iRLA   介绍配置项.配置值以及他们的使用方式.   参考链接: https://docs.qq.com/ ...

  2. Johnson-Trotter(JT)算法生成排列

        对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列.假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n ...

  3. Java实现 LeetCode 623 在二叉树中增加一行(遍历树)

    623. 在二叉树中增加一行 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N, ...

  4. Java实现 LeetCode 556 下一个更大元素 III(数组的翻转)

    556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 1 ...

  5. Java实现蓝桥杯VIP算法训练 相邻字母

    试题 算法训练 相邻字母 资源限制 时间限制:1.0s 内存限制:256.0MB [问题描述] 从键盘输入一个英文字母,要求按字母的顺序打印出3个相邻的字母,指定的字母在中间.若指定的字母为Z,则打印 ...

  6. Java中lang包的常用方法介绍

    JAVA API(图片来源:实验楼) 包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() in ...

  7. java实现第四届蓝桥杯剪格子

    剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...

  8. MySQL数据库字符集和排序规则的四个级别

    MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...

  9. Python--函数&过程

    函数式编程与过程式编程打的区分:过程是没有返回值的函数,过程在python3中也有返回值,为None 函数的作用:代码复用.保持代码的一致性.使代码更容易扩展 过程的定义与调用: 1 def func ...

  10. List集合排序的方法

    1.list集合中的对象实现Comparable接口 public class User implements Comparable<User>{ private Integer id; ...