事件

87 阅读1分钟

事件处理函数

以 click 为例

oBtn.onclick = () => {};
oBt.addEventListener("click", () => {}, flase); //第三个参数true:事件在捕获阶段处理 false:事件在冒泡阶段处理
// 以上两种方式区别
// onclick所有浏览器都兼容 但是只能绑定一个事件处理函数
// addEventListener w3c规范 IE9以下不支持,但是可以绑定多个事件处理函数

ele.attachEvent('onclick',()=>{})
// IE8及以下的绑定方式


// 封装一个兼容性写法
function addEvent(el,type,fn){
    if(el.addEventListener){
        el.addEventListener(type,fn,false)
    }
    else if(el.attachEvent){
        el.attachEvent('on'+type,fn.bind(el))
    }
    else{
        el['on'+type] = fn
    }
}

function removeEvent(el,type,fn){
  if(el.addEventListener){
    el.removeEventListener(type,fn,false)
  }
  else if(el.attachEvent){
    el.detachEvent('on'+type,fn)
  }
  else{
    el['on'+type]=null
  }
}

事件冒泡 捕获

事件一层一层从子级向父级传递触发相同类型事件的现象

事件从父级向事件源传递触发相同类型事件的现象叫捕获

如果一套结构既有捕获事件又有冒泡事件则先捕获后冒泡 绑定在事件源上的事件则按执行顺序执行

focus blur change submit reset select 无冒泡捕获事件

// e.stopPropagation() w3c阻止冒泡
// e.cancelBubble = true ie阻止冒泡
var wrapper = document.getElementsByClassName("wrapper")[0];

wrapper.addEventListener(
  "click",
  (e) => {
    var e = e || window.event;
  },
  false
);

// 取消默认事件
document.oncontextmenu = function (e) {
  // return false
  // w3c e.preventDefault() ie9及以下不兼容
  // e.returnVaule = false ie9以下的方法
};