事件 ---- 添加事件的几个方式--解除事件处理函数---事件冒泡,捕获--取消冒泡-事件-----阻止默认事件

绑定事件的几个方式
1.ele.onxxx=function(event){}  例如div.onclick=function(){}---div是dom元素
兼容性很好,但是同一元素的同一事件只能绑定一个处理函数   ---on绑定事件的方式叫句柄的方式
基本等同于写在HTML行间上
2.obj.addEventListener(type,fn,false); --IE9一下不兼容,可以为一个对象的一个事件绑定多个处理函数
 --多个处理函数是指假设div.addEventListener('click',test,false) function test(){} 这样绑定多个的话输出的是一个,因为他是一个函数,想要输出多个就要text改成function(){}让他两个函数的地址不一样
                    (事件类型,处理函数,false)  ---比如('click',function(){},false)
3.obj.attachEvent('on' + type,fn);   -->div.attachEvent('onclick',function(){})
IE独有,一个事件可以绑定多个处理程序
事件处理程序的运行环境
1.ele.onxxx = function(event){}  --程序this指向的是dom元素本身
2.obj.addEventListener(type,fn,false) -->type比如click ,程序this指向的是dom元素本身
3.obj.attachEvent('on' + type,fn); --程序this指向window

二.封装给一个dom对象添加该事件类型的处理函数,

    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{
            elem['on'+type] = handle;
        }
    }

三,解除事件处理程序

1.ele.onclick=false/''/null;
2.ele.removeEventListener(type,fn,false);
3.ele.detachEvent('on'+type,fn)               ---对应上面三个绑定事件函数
若绑定匿名函数,则无法清除 ---所以想要清除一般把函数写在外面function test(){} 然后事件里面直接调用test;
  接触事件处理函数里面的参数必须跟添加事件的时候参数一一对应

四,事件处理模型--事件冒泡,事件捕获

事件冒泡
1.结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素(自底向上)
2.事件捕获
结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素).(自顶向下)  --跟冒泡是反的,想要触发捕获把 
ele.removeEventListener(type,fn,false)false改成true就可以。
捕获触发的是从结构上来说先触发外面的然后依次往里,冒泡是先出发里面的然后往外冒泡
IE没有捕获事件只有谷歌
如果有三层嵌套,触发捕获,点击最里面的会先触发最外面的然后依次往里,点击的那个不是捕获是正常执行。 如果两个事件的话正常执行的部分是按代码的先后顺序执行
3.触发顺序,先捕获,后冒泡    ---一个对象一个事件只能遵循一种事件模型,要么捕获要么冒泡--可以设置两个事件那么就会有先后顺序
4.focus,blur,change,submit,reset,select等事件不冒泡

五,取消冒泡,阻止默认事件

1.不绑定事件处理函数有时候也会发生事件比如给document.onclick绑定事件,假如有一个小方块点击小方块就会触发事件--产生冒泡;所以要有取消冒泡功能。
2.在每一个事件处理函数里面可以写一个形参,系统会帮传一个事件对象,上面有很多属性,其中有一个属性就是W3C标准给出的event.stopPropagation()但不支持IE9以下版本
比如:div.onclick = function(e){e.stopPropagation()}就会阻止冒泡
3.Ie独有(现在谷歌也可以用了) event.cancelBubble = true;

六,封装取消冒泡函数

  function stopBubble(event){
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble = true;
        }
    }


下面的是例子
    document.onclick=function(){
        console.log("asas");
    }
    var div = document.getElementsByTagName('div')[0];
    div.onclick=function(e){
        this.style.backgroundColor="green";
        stopBubble(e);
    }

七,阻止默认事件

默认事件--表单提交,a标签跳转,右键菜单等
1.return false;以对象属性的方式注册的事件才生效 只能用于句柄状态下(就是on开头的事件)
2.event.preventDefault();W3C标注,IE9以下不兼容
3.event.returnValue = false;兼容IE


例子: var a =document.getElementsByTagName('a')[0];   ---取消a的默认事件
       a.onclick = function(){
         return false;
        }


还可以这样写<a href="javascript:void(false)">demo</a>  ---这里写void相当于return

八,封装阻止默认事件的函数cancelHandler(event)  ---比如右键出菜单

    function cancelHandler(event){
        if(event.preventDefault){
            event.preventDefault();
        }else{
            event.returnValue = false;
        }
    }

九,事件对象 ,事件源对象

事件对象  e是事件对象
在IE浏览器他会把事件对象传进window.event,谷歌可以用e
div.onclick = function(e){
   var event = e || window.event;
}
事件源对象: -->点击的那个区域事件源就会返回谁
 event.taget 火狐只有这个        ---这两个方法谷歌都有,event是事件对象
 event.srcElement IE只有这个


事件源对象兼容性写法
var target = event.target || event.srcElement;
在事件中,当前操作的那个元素就是事件源。比如网页元素中a标签和input都有onclick事件,当点击a发生onclick事件时,事件源就是a标签,当点击input发送onclic事件是,事件源就是input。
事件源对象的作用--有一个东西叫事件委托:利用事件冒泡,和事件源对象进行处理
优点:1.性能 不需要循环所有的元素一个一个绑定事件
2.灵活 当有新的子元素时不需要重新绑定事件

例如:
    <ul>
      <li>1</li>            
      <li>2</li>
      <li>3</li>          直接利用父级间接采用事件冒泡实现子元素的功能,
      <li>4</li>          利用源对象方法调用innerText就可以输出文本内容
      <li>5</li>
    </ul>

var ul = document.getElementsByTagName('ul')[0];
      ul.onclick = function(e){
        var event = e || window.event;
        var target = event.target || event.srcElement;
        console.log(target.innerText);
      }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兔子的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值