事件

142 阅读3分钟

绑定事件处理函数

  1. elem.onxxxx=function (event) {} 【兼容性好,一个对象的一个事件只能绑定一个处理函数】

  2. elem.addEventListener(type,fn,false); 【IE9以下不兼容,可以给一个对象的一个事件绑定多个处理函数】【参数:事件类型,处理函数,false】

  3. elem.attachEvent('on' + type, fn); 【IE独有,一个事件可以绑定多个处理函数】【参数类型:'on'+事件类型,处理函数】 【程序this指向window】

//给一个dom对象添加一个该事件类型的处理函数
//封装addEvent(elem,type,handle);兼容性方法
function addEvent(){
    if(elem.addEventLister){
        elem.addEventLister(type, handle, false);
    }else if(elem.attachEvent){
        elem.attacjEvent('on' + type, function(){
            handle.call(elem)
        })
    }else{
        elem['on' + type] = handle;
    }
} 

解除事件处理函数

  1. ele.onxxxx = null;
  2. ele.removeEventLister(type, fn, false);【参数要与要解除的事件处理函数一致】
  3. ele.detachEvent('on' + type, fn); 【如果绑定匿名函数,无法解除,因为在解除时找不到这个函数】

事件冒泡、捕获

结构上嵌套关系的元素,会存在事件冒泡功能,即同一事件,自子元素冒泡向父元素(自底向上)

结构上嵌套关系的元素,会存在事件捕获功能,即同一事件,自父元素捕获至子元素(自顶向下) IE没有捕获事件

  1. 触发顺序,先捕获,后冒泡。
  2. focus, blur, change, submit, reset, select等事件不冒泡。
  3. 上述方法中的参数“false”改为“true”可触发捕获(“false”是冒泡,所以不能同时存在在一个函数中)。
  4. 一个元素冒泡和捕获都绑定在一个事件上,执行这个事件时顺序是先捕获后冒泡【事件执行的顺序是谁先绑定谁先执行】。

取消冒泡

事件对象,系统会传的一个参数,把一些数据存在其中,比如事件类型,发生时刻,鼠标坐标。这个对象上有个方法,可以取消冒泡。

  1. event.stopPropagation();【不支持IE9以下版本】
  2. event.canaelBubble = true;【IE独有】
//封装取消冒泡的函数
function stopBubble(event){
    if(event.stopPropagation) {
        event.stopPropagation();
    }else{
        event.cancelBubble = true;
    }
}

阻止默认事件

表单提交、a标签跳转、右键菜单等

  1. return false; 【以对象属性的方式注册的事件才生效】
  2. event.preventDefault(); 【W3C标准 IE9以下不兼容】
  3. event.returnValue = false; 【兼容IE】
//封装阻止默认事件的函数
function cancelHandler(event) {
     if(event.preventDefault) {
         event.preventDefult();
     }else{
         event.returnValue = false;
     }
}
  1. <a href="javascript:void(0)">demo</a>也可以取消默认事件

事件对象

  1. 获取事件对象 var e = event || window.event【用于IE】
  2. 事件对象上有个属性可以知道是哪个元素触发的事件,事件源对象【触发事件的元素】。event.target【火狐】event.srcElement【IE】,chrome两个属性都有。获取事件源对象 var target = event.target || event.srcElement

事件委托

利用事件冒泡和事件源对象进行处理

  1. 不需要循环所有的元素一个个绑定事件。
  2. 当有新的子元素时不需要重新绑定事件。

比如,如果有多个子元素需绑定相同功能的函数,那就可以绑定在父级元素上,就不必一个一个去子元素上绑定事件。