DOM事件处理

<span style="font-size:14px;"><span style="font-family: KaiTi_GB2312; background-color: rgb(255, 204, 204);">一、事件流</span></span>

可以形象理解为:当我们指向一组同心圆的圆心时,所指的其实是这一组同心圆,而不只是同心圆组中位于最里层的圆

1.事件冒泡:触发事件的标签(即最里层的标签)最先感知到事件的发生,然后逐层向外传递事件,

2.事件捕获:与事件冒泡的感知方向正好相反,现在很少用

二、事件处理程序

1.HTML事件处理程序

  在html标签中设置触发事件、并调用js方法

<span style="font-size:14px;">  <input id="btn1" type="button" value="点我" οnclick="showMessage"/>
  <script type="text/javascript">
     function showMessage(){
          alert("html事件处理被触发");
     }
  </script><span style="white-space:pre">	</span></span>


缺点:html和js的耦合度太高,不利于更改

2.DOM0级事件处理程序(较传统的方式)

  把一个函数赋值给一个事件的处理程序属性

<span style="font-size:14px;"><input id="btn2" type="button" value="点我"/>
  <script type="text/javascript">
     var btn=document.getElementById("btn2");
     btn.οnclick=function(){
          alert("html事件处理被触发");
     }
     btn.οnclick=null;//事件触发动作的取消
  </script></span>

  用的较多的方法,简单,跨浏览器优势

  优点:一个按钮上可以添加多个事件处理程序,也可以添加多个事件

3.DOM2级事件处理程序

  定义了两个方法:addEventListener和removeEventListener

  接收三个参数:要处理的事件名、作为事件处理程序的函数名(触发的函数名)、bool值(为false时代表以事件冒泡形式触发)

<span style="font-size:14px;">   <input id="btn3" type="button" value="点我"/>
   <script type="text/javascript">
<pre name="code" class="javascript" style="font-size: 18px;">       function showMessage(){
             alert("html事件处理被触发");
        }
       var btn=document.getElementById("btn3");
       btn.addEventListener("click",showMessage,false);//注意:这里的事件名称没有"on"  
<pre name="code" class="javascript" style="font-size: 18px;">       btn.removeEventListener("click",showMessage,false);//删除事件(addEventListener添加的事件只能这样删除)
   </script></span>


优点:一个按钮上可以添加多个事件处理程序,也可以添加多个事件(同DOM0)

缺点:不适用于IE浏览器

4.IE事件处理程序

  定义了两个方法:attachEvent和detachEvent

  接收两个参数:要处理的事件名、作为事件处理程序的函数名(触发的函数名)--IE8及更早的版本只支持事件冒泡

<span style="font-size:14px;">   <input id="btn4" type="button" value="点我"/>
   <script type="text/javascript">
<pre name="code" class="javascript">       function showMessage(){
             alert("html事件处理被触发");
        }
       var btn=document.getElementById("btn4");
       btn.attachEvent("onclick",showMessage);
<pre name="code" class="javascript">       btn.de<span style="font-family: KaiTi_GB2312;">tachEvent</span>("onclick",showMessage);//删除事件
   </script></span>

  适用于IE和Opera

5.浏览器兼容的解决

  封装一个对象,对象中封装两个方法--添加句柄和删除句柄,方法传入三个参数:事件类型、触发的元素、事件处理函数

<span style="font-size:14px;"><input id="btn5" type="button" value="点我"/>
   <script type="text/javascript">
<pre name="code" class="javascript" style="font-family: KaiTi_GB2312;">       var eventUtil={//封装一个对象,用于实现跨浏览器的事件处理
          //添加句柄(方法)--type:事件类型;element:触发的元素;func:触发的函数;
          addHandler:funtion(type,element,func){//这里传进来的type,是不带"on"的
              if(element.addEventListener){//这里要以属性的形式判断,addEventListener、不是addEventListener()
                 <span style="font-family: KaiTi_GB2312;">element.addEventListener(type,func,false);</span>
              }else if(element.attachEvent){
<pre name="code" class="javascript" style="font-size: 18px; font-family: KaiTi_GB2312;">                 element.attachEvent("on"+type,func);
              }else{//否则,用DOM0级方式处理--element.οnclick=func形式
                 element["on"+type]=func;//由于传进来的type不带on,这里要加上。ps:所有的element.οnclick===element['onclick']
              }
          }
<pre name="code" class="javascript" style="font-size: 18px;"><pre name="code" class="javascript" style="font-family: KaiTi_GB2312;">         //删除句柄(方法)--type:事件类型;element:触发的元素;func:触发的函数;
          removeHandler:funtion(type,element,func){
              if(element.removeEventListener){
                 <span style="font-family: KaiTi_GB2312;">element.removeEventListener(type,func,false);</span>
              }else if(element.detachEvent){
                 element.detachEvent("on"+type,func);
              }else{//否则,用DOM0级方式处理--element.οnclick=func形式
                 element["on"+type]=null;
              }
          }
       }
    var btn=document.getElementById("btn5");
<pre name="code" class="javascript" style="font-size: 18px;">    function showMessage(){
             alert("html事件处理被触发");
        }

    //调用举例
    eventUtil.addHandler("click",btn,showMessage);
    eventUtil.removeHandler("click",btn,showMessage);
   </script></span>


三、事件对象(event)

IE8之前的浏览器,要用window.event获取事件,其它浏览器可以直接用event(也可以用e,ev)获取。直接获取的就是我们用鼠标或键盘所做的操作(即事件)。

1.DOM中的事件对象

常用属性:

type:用于获取事件类型

target:用于获取事件目标(即事件来自于哪个元素--event.target.nodeName可以获取到当前事件所属标签的名称)

常用方法:

stopPropagation():用于阻止事件冒泡

preventDefault():用于阻止事件的默认行为(如:对于<a>标签,除了我们给它添加的事件外,它还有一个自己默认的行为,就是href链接跳转。如果对于我们指定的事件,我们只希望执行自己指定的函数,而不执行默认的href跳转,我们就需要在事件触发的函数中,添加event.preventDefault();这个语句,用来阻止默认跳转行为发生)

2.IE中的事件对象

常用属性:

type:用于获取事件类型

srcElement:用于获取事件目标(即事件来自于哪个元素)

cancelBubble: 用于阻止事件冒泡(阻止时,设置cancelBubble=true;)

returnValue:用于阻止事件的默认行为(默认为true,要阻止默认行为时,设置returnValue=false;)

<span style="font-size:14px;"><span style="font-family: monospace; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);"><input id="btn6" type="button" value="点我"/></span>
<script type="text/javascript">
<pre name="code" class="javascript" style="font-family: KaiTi_GB2312;">       var eventUtil={//封装一个对象,用于实现跨浏览器的事件处理
          //添加句柄(方法)--type:事件类型;element:触发的元素;func:触发的函数;
          addHandler:funtion(type,element,func){//这里传进来的type,是不带"on"的
              if(element.addEventListener){//这里要以属性的形式判断,addEventListener、不是addEventListener()
                 <span style="font-family: KaiTi_GB2312;">element.addEventListener(type,func,false);</span>
              }else if(element.attachEvent){
                 element.attachEvent("on"+type,func);
              }else{//否则,用DOM0级方式处理--element.οnclick=func形式
                 element["on"+type]=func;//由于传进来的type不带on,这里要加上。ps:所有的element.οnclick===element['onclick']
              }
          },
<pre name="code" class="javascript"><pre name="code" class="javascript" style="font-family: KaiTi_GB2312;">         //删除句柄(方法)--type:事件类型;element:触发的元素;func:触发的函数;
          removeHandler:funtion(type,element,func){
              if(element.removeEventListener){
                 <span style="font-family: KaiTi_GB2312;">element.removeEventListener(type,func,false);</span>
              }else if(element.detachEvent){
                 element.detachEvent("on"+type,func);
              }else{//否则,用DOM0级方式处理--element.οnclick=func形式
                 element["on"+type]=null;
              }
          },
        getEvent:function(event){
<span style="white-space:pre">	</span>      return event?event:window.event;
          },
        getType:function(event){
              return event.type;
          },
        getElement:function(event){
              return event.target || event.srcElement;
          },
        preventDefault:function(event){
              if(event.preventDefault){
                   event.preventDefault();
              }else{
                   event.returnValue=false;
              }
          },
        stopPropagation:function(event){
<pre name="code" class="javascript" style="font-size: 18px;"><pre name="code" class="javascript" style="font-family: KaiTi_GB2312;">              if(event.stopPropagation){               
<pre name="code" class="javascript" style="font-size: 18px; font-family: KaiTi_GB2312;">                   event.stopPropagation();
              }else{
                   event.cancelBubble=true;
              }
          }
       }
    //调用举例
    var btn=document.getElementById("btn6");
    eventUtil.addHandler("click",btn,function(e){//这里的e,就是获取的事件对象
        e=eventUtil.getEvent(e);//防止浏览器不兼容,再次获取事件e(将e传到我们封装好的方法里,从而转换为我们希望得到的e。如果不经过这步转换,很可能因为浏览器不兼容,而无法获得e对象)
        eventUtil.getElement(e);//这里传入的就是我们转换后的e了
    });
</script></span>


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值