事件

相关代码已放在我的Github:https://github.com/kisscancer/cnblogs.com-ch11ry/tree/master/Event

 

一.DOM事件流(三个阶段):

  • 事件捕获阶段
  • 处于目标阶段(被看作是事件冒泡阶段的一部分)
  • 事件冒泡阶段

// TODO:代码示例1

 

二.添加事件的方法:

  • HTML中添加事件处理程序(<a onclick="clickEvent()">示例</a>)
  • DOM0级事件处理程序。即用js先获取元素,再给元素赋值具体的事件;解除事件时,将对应事件置为null即可。缺点:只能给对应事件绑定一个处理函数
  • DOM2级事件处理程序。使用addEventListener/removeEvenrListener方法。优点:可以绑定多个处理函数
  • IE8及之前需要使用attachEvent/detachEvent

// TODO:代码示例2

 

三.DOM中的event对象

  • type(String):表示的事件类型。如“click”、“dblclick”
  • bubbles(Boolean):表示是否冒泡
  • cancelable(Boolean):表示是否可以取消事件的默认行为
  • currentTarget(Element):事件处理程序当前正在处理的那个元素(注册事件的那个元素,例如点击了一个button,但是事件注册在body上,那么target为body)
  • defaultPrevented(Boolean):为true时,表示已经调用了event.preventDefault()方法
  • detail(Integer):与事件相关的细节信息
  • eventPhase(Integer):调用事件处理程序的阶段: 1表示捕获阶段, 2表示“处于目标”, 3表示冒泡阶段
  • preventDefault()(Function):取 消 事 件 的 默 认 行 为 。 如 果 cancelable是true,则可以使用这个方法
  • stopImmediatePropagation()(Function):取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用(DOM3级事件中新增)
  • stopPropagation()(Fcuntion):取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法
  • target(Element):事件的目标(用户操作的那个元素,例如点击了一个button,但是事件注册在body上,那么target为button)
  • trusted(Boolean):为true表示事件是浏览器生成的。为false表示 事 件 是 由 开 发 人 员 通 过 JavaScript 创 建 的(DOM3级事件中新增)

四.IE中的event对象(需要通过window.event来获得)

  • cancelBubble(Boolean):默认值为false,但将其设置为true就可以取消事件冒泡(与DOM中的stopPropagation()方法的作用相同)
  • returnValue(Boolean):默认值为true,但将其设置为false就可以取消事件的默认行为(与DOM中的preventDefault()方法的作用相同)
  • srcElement(Element):事件的目标(与DOM中的target属性相同)
  • type(String):被触发的事件的类型

五.内存和性能

  • 如果出现一个页面有非常多的事件绑定,那么会对内存和性能造成影响。为了解决此类问题,可以采用“事件委托”的方法。事件委托指的是,只指定一个事件处理程序。例如click事件会一直冒泡到document,那么我们就在docoment的click事件中做处理。而不用为每个元素都绑定一个click事件。

六.造一个轮子:模拟事件处理

  • 需求如下:
    • 实现add(添加事件)、remove(移除事件)、trigger(触发事件)三个方法
    • add:1.可以针对不同的事件名添加不同的处理程序;2.同一个处理程序只允许添加一次,多次添加会过滤
    • remove:1.可以针对不同的事件名移除对应的处理程序;
    • trigger:1.按顺序执行处理程序;2.一个处理程序报错,不会影响其他处理程序
    • 以上三个方法,需要返回对象本身

// TODO:代码示例3

 

 

posted @ 2017-09-20 13:34  Ch11ry  阅读(116)  评论(0编辑  收藏  举报