Board logo

标题: JS事件~(1) [打印本页]

作者: look_w    时间: 2019-4-12 13:45     标题: JS事件~(1)

DOM事件流

事件流包括三个阶段

    捕获阶段
    目标阶段
    冒泡阶段
    事件一开始从文档的根节点流向目标对象(捕获阶段),然后在目标对象上被触发(目标阶段),之后再回溯到文档的根节点(冒泡阶段)

    所有的事件都会经过捕获阶段和目标阶段,但有些事件会跳过冒泡阶段,比如,让元素获得输入焦点的focus事件已经失去输入焦点的blur事件就都不会冒泡

事件处理程序

HTML事件处理程序

    <input type="button" value="click me" onclick=“console.log(event.type)” />
     
    <input type="button" value="click me" onclick=“handler(event)” />

    结构和行为相耦合,不易维护
    DOM 0级事件处理程序

    btn.onclick = function(){
      ...
    }

    这种方式会在事件流的冒泡阶段被处理,删除事件 btn.onclick = null

DOM 2级事件处理程序
dom.addEventListenter() / dom.removeEventListener()
接收3个参数:要处理的事件名, 函数, 布尔值
可以为同一个元素添加多个同类型事件
按照顺序触发
IE事件处理程序
attachEvent() 和 detachEvent()
接收2个参数, 事件名(要加‘on’),函数
IE8及之前的版本
只支持事件冒泡
可添加多个处理程序,但触发顺序是反着来的
最大的区别是:作用域是 全局,this.id指的是 window的id

    // 兼容性写法
    function addEvent(type, el, fn){
      if(window.addEventListener){
        el.addEventListenter(type,fn,false)
      }else if(window.attachEvent){
        el.attachEvent('on'+type, fn)
      }
    }
    // 结合惰性函数的兼容性写法
     var addEvent = function (type, el, fn){
      if(window.addEventListener){
        addEvent = function(type, el, fn){
          el.addEventListenter(type,fn,false)
        }
      }else if(window.attachEvent){
        addEvent = function(type, el, fn){
           el.attachEvent('on'+type, fn)
        }
      }
    }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0