1. 事件绑定的几种方式

   主要介绍一下 最常用的事件设计 其他就稍微带过。

  直接在代码里面添加onclick指定函数名字。

  

  B) 在JS代码中通过dom元素的onclick等属性

  

  这种做法this表示当前DOM对象 还有一点 这种做法只能绑定一个事件处理函数 后面的会覆盖前面的。可以看出 只能打印 "2 = div"

  C) 至于IE下面的attachEvent 函数就不介绍了 直接介绍W3C的 标准的 addEventListener 和 removeEventListener。

  IE8 之前都不支持 IE9就开始支持了。

  addEventListener(type, listener, userCapture);

  // type : 事件类型 不含"on"  "click" "keydown"

   // listener : 事件处理函数

   // userCapture 是事件冒泡 还是事件捕获默认false 代表时间冒泡类型

  事件处理函数中this代表的是dom对象 不是window 这个特性与attachEvent不同

  

  B 同一个事件处理函数可以绑定2次 一次用于事件捕获 一次用于时间冒泡。

  

2. 事件处理函数的执行顺序

  前面的方式都不能实现事件的重复绑定 所以自然也就不存在执行顺序的问题 最后面的一种可以重复绑定 所以需要了解执行顺序的问题。

  addEventListener 和attachEvent表现一致。如果给同一个事件绑定多个处理函数 先绑定的先执行

  

  当点击outA的时候 会依次打印出 1 2 3 4 这里需要特别注意 我们给定A绑定多个onclick事件处理函数 也是直接点击A触发的事件 所以不涉及事件冒泡和事件捕获的问题。

 

3. 事件冒泡和事件捕获

    

  如果点击了最内侧的C 那么最外层的A算不算被点击了呢。 很显然算的 不然就没有必要区分事件冒泡和事件捕获

  

  一般来说 事件冒泡机制用的更多一点 所以在IE8 之前 IE 只支持事件冒泡 IE9+/FF/Chrome这2种模型都支持,可以通过addEventListener((type, listener, useCapture)的useCapture来设定,useCapture=false代表着事件冒泡,useCapture=true代表着采用事件捕获

  

  事件冒泡 当点击C的时候 打印顺序是3 2 1. 将false 改成true 打印的顺序就是 1  2  3

4. DOM事件流

  

  
    DOM事件流:将事件分为三个阶段:捕获阶段、目标阶段、冒泡阶段。先调用捕获阶段的处理函数,其次调用目标阶段的处理函数,最后调用冒泡          阶段的处理函数。

    

    当点击outC的时候,依次打印出capture1–>capture2–>target–>bubble2–>bubble1。到这里是不是可以理解addEventListener(type,handler,useCapture)这个API中第三个参数useCapture的含义呢?useCapture=false意味着:将事件处理函数加入到冒泡阶段,在冒泡阶段会被调用;useCapture=true意味着:将事件处理函数加入到捕获阶段,在捕获阶段会被调用。从DOM事件流模型可以看出,捕获阶段的事件处理函数,一定比冒泡阶段的事件处理函数先执行。

 5 事件函数执行先后顺序

    目标自身触发事件 是冒泡还是捕获无所谓

    捕获阶段的处理函数最先执行,其次是目标阶段的处理函数,最后是冒泡阶段的处理函数。

    目标阶段的处理函数,先注册的先执行,后注册的后执行

6. 阻止事件冒泡和捕获

    默认情况下 多个事件处理函数会按照DOM 事件流模型中的顺序执行 如果子元素上发生某个事件 不需要执行父元素上注册的事件处理函数

    那么我们可以停止捕获和冒泡 前面提到的事件绑定方式,都可以实现阻止事件的传播。由于第5种方式,是最推荐的做法。所以我们基于第5种方    式,看看如何阻止事件的传播行为。IE8以及以前可以通过 window.event.cancelBubble=true阻止事件的继续传播;IE9+/FF/Chrome通过     event.stopPropagation()阻止事件的继续传播。

    

    点击outC的时候,之后打印出capture–>target,不会打印出bubble。因为当事件传播到outC上的处理函数时,通过stopPropagation阻止了事件的继续传播,所以不会继续传播到冒泡阶段。

JavaScript 中的事件设计的更多相关文章

  1. javascript 中的事件机制

    1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...

  2. 看懂此文,不再困惑于 JS 中的事件设计

    看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...

  3. JS 中的事件设计

    看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong    抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 ...

  4. js实例分析JavaScript中的事件委托和事件绑定

    我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...

  5. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  6. JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获

    先看下面的示例代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Jav ...

  7. 了解javascript中的事件(二)

    本文目录如下: 零.寒暄 一.事件的分类 二.事件代理 2.1 问题引出 2.2 什么是事件代理 2.3 完整示例 二.事件代理 三.事件代理思想的用处 四.总结 零.寒暄 这篇博客本该出现在两个月以 ...

  8. javascript中onclick事件能调用多个方法吗

    Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了

  9. 深入理解javascript中的事件循环event-loop

    前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...

随机推荐

  1. Resizable(调整大小)组件

    一.加载方式 //class 加载方式 <div id="rr" class="easyui-resizable" data-options=" ...

  2. a标签的onclick和href事件的区别

    在执行顺序上href是低于onclick的,那么这个会造成什么影响呢 <div onclick="a()"> <a href="#" oncl ...

  3. sql练习总结(一)

    最近在学sql,遇到了这么一道题: 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的. 把所能想到的实现方法都做了一遍: 1.用 ...

  4. 报错: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is ins

    环境:Xcode7.1.1 + iOS9.1 详细错误: App Transport Security has blocked a cleartext HTTP (http://) resource ...

  5. js和jquery中的触发事件

    改别人的坑,遇到jquery选择器和fireEvent混用,不认识fireEvent方法报错. js的方法不能使用jquery的选择器去调用. 1.fireEvent (IE上的js方法 ) 我们来看 ...

  6. C语言初学 if-else语句判断俩数的最大值

    #include<stdio.h> main() { float a,b; printf("输入俩个任意实数\n"); scanf("%f%f",& ...

  7. cf E. Valera and Queries

    http://codeforces.com/contest/369/problem/E 题意:输入n,m; n 代表有多少个线段,m代表有多少个询问点集.每一个询问输出这些点的集合所占的线段的个数. ...

  8. 桌面上嵌入窗口(桌面日历)原理探索(将该窗口的Owner设置成桌面的Shell 窗口,可使用SetWindowLong更改窗口的GWL_HWNDPARENT,还要使用SetWindowPos设置Z-Order)

    今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样. 我当时想到的就是建立一个Child  Window,将他的父窗口设置成桌面Shell窗口就可以了.但是 ...

  9. 基于AForge.Net框架的扑克牌识别

    原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译  下载源代码 - 148.61 KB ...

  10. 关于老驱动不能在windows 8下正常安装的问题

    问题: 老驱动(WDF),能在windows 7下安装并工作,但是不能在windows 8下安装. 先了解下windows 8驱动的新东西吧: New for windows 8 http://msd ...