JavaScript 事件冒泡和事件捕捉

含义

事件冒泡

事件的触发顺序为,由内而外。直到文档最顶层(document或window)。

事件捕捉

事件的触发顺序为,由外而内。

像blur,focus,load,unload不支持冒泡。
任何发生在w3c事件模型中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。

//使用事件捕捉模式
element1.addEventListener('click',doSomething2,true)
//使用事件冒泡模式(默认)
element2.addEventListener('click',doSomething,false)

阻止冒泡

even.stopPropagation();

//只输出 a标签  里层div,但是超链接依旧跳转。
//该方法只能阻止冒泡,不能阻止默认行为。
<div id="parent-div">
   <div id="child-div">
       <a href="#">点击我</a>
   </div>
</div>
<script type="text/javascript">
   $("#parent-div").click(function () {
       console.log("外层div");
   });
   $("#child-div").click(function (even) {
       console.log("里层div");
       even.stopPropagation();
   });
   $("a").click(function () {
       console.log("a标签");
   });
</script>

return false;


//即阻止默认行为,也阻止冒泡
<div id="parent-div">
    <div id="child-div">
        <a href="www.baidu.com">点击我</a>
    </div>
</div>
<script type="text/javascript">
    $("#parent-div").click(function () {
        console.log("外层div");
    });
    $("#child-div").click(function (even) {
        console.log("里层div");
        return false;
    });
    $("a").click(function () {
        console.log("a标签");
    });
</script>

event.preventDefault();

//只阻止默认行为,而不阻止冒泡。
//event.preventDefault();放在任何一层中,都会阻止。
<div id="parent-div">
    <div id="child-div">
        <a href="www.baidu.com">点击我</a>
    </div>
</div>
<script type="text/javascript">
    $("#parent-div").click(function () {
        console.log("外层div");
    });
    $("#child-div").click(function (even) {
        console.log("里层div");
    });
    $("a").click(function (even) {
        console.log("a标签");
        even.preventDefault();
    });
<script>

事件对象event

支持至少DOM2级的浏览器所有事件的事件对象,都会有的成员。

属性/方法类型读写解释
bubblesBoolean只读表明事件是否冒泡
stopPropagation()Function只读取消事件的进一步捕获或冒泡,如果bubbels为true,则可以使用这个方法
cancelableBoolean只读表明是否可以取消事件的默认行为
preventDefault()Function只读取消事件的默认行为,如果cancelable为true,则可以使用这个方法
currentTargetElement只读其事件处理程序当前正在处理事件的那个元素
targetElement只读事件的目标
detailIntegar只读与事件相关的细节信息
eventPhaseIntegar只读调用事件处理程序的阶段:1表示捕获阶段2表示处于目标3表示冒泡阶段
typeString只读被触发的事件的类型
viewAbstractView只读与事件关联的抽象视图。等同于发生事件的window对象

在IE8及其以前版本的浏览器是不兼容DOM2级的,但是还是可以使用dom0级的方法添加事件处理程序。

属性/方法类型读写解释
cancelBubbleBoolean读写默认值为false,但将其设置为true就可以取消事件冒泡,与DOM中stopPropagation()的方法作用相同
returnvalueBoolean读写默认值为true,但将其设置为fasle,就可以取消事件的默认行为,与DOM中的preventDefault()方法的作用相同
srcElementElement只读事件的目标,与DOM中的target属性相同
typeString只读被触发的事件类型

兼容性处理对象

var EventUtil={
    getEvent:function(event){ //获取事件对象
        return event||window.event;
    },
    getTarget:function(event){ //获取事件目标
        return event.target||event.srcElement;
    },
    preventDefault:function(){ //阻止默认行为
        if(event.preventDefault){
            event.preventDefault();
        }else{
            event.returnValue=false;
        }
    },
    stopPropagation:function(){ //阻止冒泡
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble=true;
        }
    },
    addHandler:function(element,type,handler){ //注册事件
        if(element.addEventListener){
            element.addEventListener(type,handler,false);
        }else if(element.attachEvent){
             element["e"+type]=function(){
              handler.call(element)
          }
            element.attachEvent("on"+type,element["e"+type]);
        }else{
            element["on"+type]=handler;
        }
    },
    removeHandler:function(element,type,handler){ //移除事件
        if(element.removeEventListener){
            element.removeEventListener(type,handler,false);
        }else if(element.detachEvent){
            element.detachEvent("on"+type,element["e"+type]);
            element["e"+type]=null;   
        }else{
            element["on"+type]=null;
        }
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值