javascript事件基础----事件模型比较

一、基本事件模型:通过事件属性来设计的

     绑定事件:

    1、 静态绑定:把javascript脚本作为属性直接赋予给事件属性

            <button  onclick="this.style.background='red' ">按钮(this表示获取当前对象)</button>

            <button  onclick="(e.srcElement?e.srcElement:e.target).style.background='red' ">按钮</button>

           <button  id="btn1"  οnclick="btn1()">按钮</button>

           <button  id="btn2"  οnclick="btn2(event)">按钮</button>

         <script>

            function btn1(){this.style.background='red'}

            function btn2(event){   //标准型模式必须传递此对象          

                 var e=e||window.event; //  获取事件对象  兼容标准模型和IE模型的Event

                    var src= e.srcElement?e.srcElement:e.target;

                     src.style.background='red';

              }

        </script>

  2、动态绑定:利用DOM对象的事件属性进行赋值

      <button  id="btn">按钮</button>

      <script>

           var button=document.getElementById("btn");

           button.onclick=function(e){

              var e=e||window.event; //  获取事件对象  兼容标准模型和IE模型的Event

             document.write(e.srcElement?e.srcElement:e.target);//获取单签事件源 兼容标准模型和IE模型的属性

             }

 </script>

     

二、标准事件模型:通过调用元素对象的addEventListener()方法来注册事件,支持三阶段(捕获 阶段 目标阶段  冒泡阶段 )

   注册事件:element.addEventListener(String type,Funtion listener,boolean useCapture)

   注销事件: element.removeEventListener(String type,Funtion listener,boolean useCapture)

             ---removeEventListener()只能够删除addEventListener方法注册的事件,不能删除 直接使用onclick等直接写在元素上的事件

注意:可以为多个对象注册同一事件,也可以为同一个对象注册多个事件处理函数

   Event对象的属性:

        只读属性:

type:获取事件的类型:如click

target:发生事件的节点(当前被激活事件的具体对象)

currentTarget:事件传播到的节点,(在捕获或冒泡阶段处理事件时,与target值不同)

eventPhase:显示当前所处事件传播过程的阶段

timeStamp:事件发生的时间。

bubbles:显示事件是否能够在文档中冒泡

cancelable:显示事件是否能够取消默认动作

stoppropagation():阻止当前事件从正在处理它的节点传播

preventDefault():阻止默认动作的执行

除以上属性Event基本属性外,各个事件子模块也定义了私有属性和方法

UIEvent提供view(发生事件的window对象) 和detail(事件的详细信息)属性

MouseEvent除拥有Event和UIEvent属性和方法外,还有以上比较实用的属性

       button:当在声明mousedown  mouseup click事件时,显示鼠标键的状态值,0左键,1中间键,2右键

       altKey,ctrlKey,metaKey,ShiftKey:表示在声明鼠标事件时是否按下Alt Ctrl  Meta Shift

     clientX,clientY:声明事件发生时鼠标指针相对于客户区域 浏览器窗口  左上角的x轴和Y轴的坐标值

     screenX,screenY:声明事件发生时鼠标指针相对于 用户显示器 左上角的x轴和Y轴的坐标值

    relatedTarget:引用与事件的目标节点相关的节点,对于mouseover,它是鼠标移动到目标上时所离开的那个节点

                   对于mouseout,它是离开目标时鼠标将要进入的那个节点

 

三、IE事件模型

    与标准事件模型相近,用法上略不同,IE把Event对象视为Window对象的一个属性,IE传播只有两个阶段:  目标事件和冒泡,不支持捕获

注册事件:element.attachEvent(etype,eventName)--etype -->"onclick"  "onmousemove"等   带on开头

注销事件:element.detachEvent(etype,eventName) 

<p id="p1">IE事件注册</p>

var  p1=document.getElementById("p1");  //

p1.attachEvent("onmouseover",function(){

   p1.style.background="red";   //这里不能用this,事件函数中this指向的是window,而不是当前对象

})

p1.attachEvent("onmouseout",function(){

   p1.style.background="bule";   //这里不能用this,事件函数中this指向的是window,而不是当前对象

})

IE的Event对象(window的一个属性,通过window.event访问)

  Event的只读属性:

type:获取事件的类型

srcElement:发生事件的元素, 等同 标准中的  target

button:按下鼠标键的状态,1左2右4中间,3(=1+2)同时左右,标准中   0左2右1中间

clientX,clientY:声明事件发生时鼠标指针相对于客户区域 浏览器窗口  左上角的x轴和Y轴的坐标值,等同 标准中

offsetX,offsetY:事件发生时鼠标指针相对源元素左上角的x轴和Y轴,标准中没有此类属性

 altKey,ctrlKey,ShiftKey:表示在声明鼠标事件时是否按下Alt Ctrl  Shift比标准少metaKey,等同标准中

keyCode:声明keydown  、keyup的键代码以及keypress的Unicode字符 ,可借助String.fromCharCode()将这些转成字符

fromElement,toElement:分别声明鼠标移动过去的元素和鼠标将要移动的元素   等同标准中的relatedTarget

以下两个可设置属性:

canceBubble:true 阻止事件冒泡,默认false  等同标准中的stopPropagation()方法

returnValue:false 阻止事件的默认动作,默认为true 等同标准中的preventDefault()

标准与IE兼容:

var event=event||window.event ;//标准中,必须把event传入

window.event.canceBubble=true;//IE阻止事件冒泡

 event.stopPropagating();//标准阻止事件冒泡

    if(typeof e.cancelBubble=='undefined'){//阻止冒泡的IE和标准兼容
                e.stopPropagation();
            }else{
                e.cancelBubble=true;
            }

event.preventDefault()//标准阻止事件的默认行为,如a标签

 window.event.returnValue=false;//IE取消默认行为,取消了超链接

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>事件兼容w3c与IE</title>
    </head>
    <body>
        <input type="button" value="test" id='btn'/>
        <br/>
        <a href="http://www.baidu.com" id='Baidu' > 百度</a>
        <div id="box1">
            <input type="button" value="test1" id='btn1' />
        </div>
        <script type="text/javascript">
            //事件绑定:addEventListener与attachEvent
            //事件移除:removeEventListener与detachEvent
            //获取事件对象:e.target与window.event.srcElement
            //阻止冒泡:e.stopPropagation与window.event.cancelBubble
            //阻止默认:e.preventDdfault与window.event.returnValue
            var btn=document.getElementById('btn');
            btn.οnclick=function(){
                alert(window.event.srcElement===this);//IE获取事件
            }
            
            btn.attachEvent('onclick',function(event){
               alert(event.srcElement===this);
            });
            
            var link=document.getElementById("Baidu");
            link.οnclick=function(){
                window.event.returnValue=false;//取消默认行为,取消了超链接
                
            }
            
            var box1=document.getElementById("box1");
            var btn1=document.getElementById("btn1");
            box1.οnclick=function(){
                alert('box1 clicked');
            }
            btn1.οnclick=function(){
                alert('button clicked');
                window.event.cancelBubble=true;//取消冒泡,IE中只有冒泡方式
            }
            document.body.οnclick=function(){
                alert("body clicked");
            }
        </script>
    </body>
</html>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值