JavaScript事件



JavaScript事件(Event)


一、事件流


1、事件冒泡


  事件沿DOM树向上传播




2、事件捕获


  事件到达预定目标之前被捕获




3、DMO2级事件


  事件捕获阶段,处于目标阶段,事件冒泡阶段






二、事件处理程序


格式:on + "事件名"


1、HTML事件处理程序


1 <input type="button" value="click me" οnclick="showMessage()" >


 


2、DOM0级事件处理程序


1 element.onclick = function(){ //... }






3、DOM2级事件处理程序


1 element.addEventListener(type,handle,boolean);
2 element.removeEventListener(type,handle,boolean);






4、IE事件处理程序(ie9以下版本)


1 element.attachEvent("on" + type,handle);
2 element.detachEvent("on" + type,handle);


【注:此时事件处理函数的作用域为全局作用域,this等于window】






三、事件对象


1、DOM(DOM0或DOM2级)中的事件对象


a、事件对象(event)作为参数传入于事件处理程序中
b、对象this,currentTarget,target之间的关系


对象this始终等于currentTarget
当事件处于捕获或冒泡阶段时,三者不相等
当事件处于目标阶段时,三者相等


c、preventDefault()与stopPropagation()
preventDefault(): 取消事件默认行为
stopPropagation(): 阻止事件的捕获和冒泡




2、IE中的事件对象(ie9以下版本)


a、通过window.event来访问事件对象,在使用attach添加事件时,也可以作为参数传入
b、cancelBubble设置为true时,取消事件冒泡
c、returnValue设置为false时,取消事件的默认行为
d、srcElement与DOM中的target属性相同






四、跨浏览器的事件对象






 1 var EventUtil = {
 2     addHandler: function(element,type,handler){
 3         if(element.addEventListener){
 4             element.addEventListener(type,handler,false);
 5         }else if(element.attachEvent){
 6             element.attachEvent( "on" + type,handler);
 7         }else{
 8             element["on" + type] = handler;
 9         }
10     },
11     getEvent: function(e){
12         return e ? e : window.event;
13     },
14     getTarget: function(e){
15         e = this.getEvent(e);
16         return e.target || e.srcElement;
17     },
18     getRelatedTarget: function(e){
19         e = this.getEvent(e);
20         if(e.relatedTarget){
21             return e.relatedTarget;    
22         }else if(e.fromTarget){
23             return e.fromTarget;    
24         }else if(e.toTarget){
25             return e.toTarget;
26         }else{
27             return null;
28         }
29     },
30     stopPropagation: function(e){
31         e = this.getEvent(e);
32         if(e.stopPropagation){
33             e.stopPropagation();
34         }else{
35             e.cancelBubble = true;
36         }
37     },
38     preventDefault: function(e){
39         e = this.getEvent(e);
40         if(e.preventDefault){
41             e.preventDefault();
42         }else{
43             e.returnValue = false;
44         }
45     },
46     removeHandler: function(element,type,handler){
47         if(element.removeEventListener){
48             element.removeEventListener(type,handler,false);
49         }else if(element.detachEvent){
50             element.detachEvent( "on" + type,handler);
51         }else{
52             element["on" + type] = null;
53         }
54     }
55 }






 


五、事件委托


事件委托: 就是利用事件冒泡,把事件注册到目标元素的更高层级元素上,用来减少页面事件处理程序,提高页面性能


如:HTML


1 <ul id="ul">
2     <li id="li1"></li>
3     <li id="li2"></li>
4     <li id="li3"></li>
5 </ul>


JavaScript






 1 var ul = document.getElementById("ul");
 2 EventUtil.addHandler(ul,"click",function(e){
 3     var target = EventUtil.getTarget(e);
 4     switch(target.id){
 5         case "li1":
 6         console.log(target.id);
 7         break;
 8         
 9         case "li2":
10         console.log(target.id);
11         break;
12         
13         case "li3":
14         console.log(target.id);
15         break;
16     }
17 });






 


六、命名空间(对象)中的变量访问


命名空间中的变量可以直接访问全局中的变量,但是不能访问其他(函数)作用域中的变量,只能通过传递参数来访问


1、错误代码:






1 obj = {
2     method: function(){
3         console.log(arg);
4     }
5 }
6 function fn(arg){
7     obj.method();
8 }
9 fn("test"); //arg is not defined






不能直接访问其他作用域中的变量




2、访问全局变量:






1 var arg = "test";
2 var obj = {
3     method: function(){
4         console.log(arg);  //可以直接访问全局变量arg
5     }
6 }
7 obj.method(); //test








3、传递参数来访问变量:






1 var obj = {
2     method: function(arg){ //通过传递参数来访问其他函数中的变量
3         console.log(arg);
4     }
5 }
6 function fn(arg){
7     obj.method(arg);
8 }
9 fn("test"); //test

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值