js事件、事件流、事件处理程序、事件对象

119 阅读3分钟

事件

JavaScript与HTML的交互是通过事件实现的,事件代表文档或浏览器窗口中某个有意义的时刻,可以使用仅在事件发生时执行的监听器(处理程序)订阅事件,这个模型叫观察者模式,使能做到页面行为和页面展示的分离。

事件流

当点击一个按钮不仅点击了这个按钮,还有它的容器和整个页面。事件流描述了页面接收事件的顺序。

  • 事件冒泡:事件从最具体的元素开始出发向上传播到没那么具体的元素。
  • 事件捕获:事件从最不具体的元素开始传播到最具体的元素。
  • DOM事件流:dom2规范事件流分三个阶段,先捕获,到达目标,再冒泡

事件处理程序(监听器)

为响应事件而调用的函数,以on开头,比如click事件的处理程序为onclick

  • HTML事件处理程序:用处理程序名以html属性的形式指定,属性值必须是可执行的js代码,this是所在目标元素
  • DOM0事件处理程序:把一个函数赋值给一个事件处理程序属性,此时this等于元素,赋值null就是移除
  • DOM2事件处理程序:定义了addEventListener和removeEventListener函数,暴露在所有dom节点上,接收三个参数,事件名、事件处理函数、布尔值(默认false为冒泡阶段调用事件处理函数,跨浏览器兼容性好,捕获阶段常用于在事件到达指定目标前拦截事件),多个事件处理函数会以添加顺序来触发。必须用remove来移除add的程序没所以添加的匿名函数无法移除
  • IE事件处理程序:attachEvent和detachEvent,接受两个参数,添加到冒泡阶段,会以添加事件顺序反向触发
  • 跨浏览器事件处理程序:addHandler和removeHandler,目标元素、事件名、事件处理函数。首先检测是否存在DOM2方式,如果有就使用该方式,否则就看是否存在IE方式,最后看DOM0方式。

事件对象

dom发生事件所有相关信息都被收集和存储到event对象中。

  • currentTarget是当前事件处理程序所在的元素,target是事件目标。this对象始终等于currentTarget的值,而target只包含事件的实际目标,如果事件处理程序直接加在了意图的目标,则this、target、currentTarget的值是一样的。但如果是添加到父节点,那么target还是会指向实际目标,而currentTarget就会指向父元素,事件会通过冒泡的形式触发处理程序。
ducument.body.onclick=function(event){
    console.log(event.currentTarget===document.body);
    console.log(this===document.body);
    console.log(event.target===document.getElementById("myBtn"));
}
  • preventDefault:取消默认行为
  • stopPropagation:立即阻止事件流在DOM结构中传播,取消后续的事件捕获或冒泡,比如在添加到按钮的事件处理程序里调用后,可阻止document.body上注册的事件处理程序执行。
  • eventPhase:确定事件流所处阶段