前端交互体验核心之事件(一)

 

  • 如何绑定事件处理函数
  • 事件处理程序的运行环境
  • 解除事件处理程序
  • 事件处理模型————冒泡、捕获
  • 默认事件
  • 事件对象
  • 事件委托

如何绑定、解除事件处理函数

一、绑定事件处理函数

 1.ele.on xxx = function(event){}

  • 兼容性好,但是一个元素的同一个事件只能绑定一个处理函数
  • 基本等同于写在HTML行间
  • 行间句柄绑定示例:<div style="width:100px;height:100px;background-color:red;" onclick="console.log('谁点我了?')"></div>

2.dom.addEventListener(‘事件类型‘,处理函数,false);

  • IE9以下不兼容,可以为一个事件绑定多个处理程序(W3C标准)
  • 绑定同一个处理函数多次,不能执行多次
  • 第三个参数指定事件是否在捕获或冒泡阶段执行

3.dom.attachEvent('on'+ 事件类型 , 处理函数);

  • IE独有,一个事件同样可以绑定多个处理程序
  • 绑定同一个处理函数多次,可以执行多次
  • 示例:dom.attachEvent('onClick',function(){});

二、事件处理程序的运行环境

 1.ele.onxxx = function(event){}                  ==> 程序this指向是DOM元素本身。

 2.dom.addEventListener(type,fun,false);  ==> 程序this指向是DOM元素本身。

 3.dom.attachEvent('on' + Type ,fun);        ==>程序this指向是window。

了解this指向规则可以访问我的另一篇博客:

//实现全兼容性的事件函数绑定方法 //addEventListener是w3c标准方法,IE9以下不兼容 //attachEvent是ie的独有方法,但是this指向window,通过call修正this指向dom本身 //on...方式不能绑定一个方法function addEvent(elem,type,handle){     if(elem.addEventListener){         elem.addEventListener(type,handle,false);         }else if(elem.attachEvent){         elem.attachEvent('on' + type, function(){             handle.call(elem);          });     }else{
     type = type.substring(0,1).toUpperCase()+type.substring(1); elem[
'on' + type] = handle; } }
复制代码

三、解除事件处理程序

 1.ele.on XXX = function(){}的事件解除和应用:

  • 理解:句柄绑定的事件程序,是一个变量(属性)赋值的方式。
  • 解决方案:将值清空即等于解除绑定程序。
  • 实现:ele.on XXX = false/""/null

 应用:典型应用功能是网页内的点击跳转链接小广告,点击一次后再点击就不会出现跳转。(案例模拟逻辑,没有具体实现)

复制代码
//html<div style="width: 100px;height: 100px;background-color: red;"></div>//jsvar advDIV = document.getElementsByTaName('div')[0]; advDIV.onclick = function(){     console.log(a);     advDIV.onclick = null; }
复制代码

2.dom.addEventListener(‘事件类型‘,处理函数,false)的事件解除:

  • 解除方法:dom.removeEventListener(‘事件类型‘,处理函数,false)
  • 理解:与绑定的DOM对象要一致,事件、函数、要一一对应。

 3.dom.attachEvent('on'+ 事件类型 , 处理函数)的事件解除:

  • 解除方法:dom.detachEvent('on' + type, fn)
  • 理解:与removeEventListener方法一致

解除事件处理程序需要注意的问题(addEventListener、attachEvent):若绑定匿名函数,则无法解除。比如直接在绑定函数时直接在绑定方法上写入函数表达式,这种绑定是无法解除的。

复制代码
advDIV.addEventListener('click',function(){     console.log("a"); },false);
复制代码

事件处理模型(冒泡、捕获)

四、事件冒泡

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

解析:事件冒泡就是嵌套的元素,同一事件在子元素上触发后,从子元素到父元素及祖辈元素依照嵌套层级关系逐个触发执行。

实现:在绑定事件程序时,第三个参数设置为false(默认)及设置dom的事件触发模型为事件冒泡。(例如:addEventListener('click',function(){...},false);)

点击测试

 实例测试的事件采用句柄绑定的弹窗(句柄绑定可以默认触发事件冒泡),浏览器如果有设置禁止弹窗无法测试,最后附上代码:

复制代码


                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信