事件操作方式

<!-- 
        操作事件
           1. 属性事件   DOM0级
               <div onclick="函数()">按钮</div>
            
           2. 绑定事件   DOM2级
                var divEle = document.querySelector('div')
                divEle.onclick = function(){
                    //执行的代码
                }
           3. 事件监听
              addEventListener 非IE 7,8
                事件源.addEventListener(事件类型,function(){
                    事件处理函数
                })
              attachEvent :IE 7 8 下使用
                 事件源.attachEvent(事件类型,事件处理函数)
            
        三种事件操作方式区别
           

     -->
</head>
<body>
    <div>按钮</div>

    <script>
          var divEle = document.querySelector('div')
          divEle.addEventListener('click',function(){
              //触发事件后执行的代码
              alert('事件监听')
          })


事件操作区别
<div>按钮</div>
    <script>
        var divEle = document.querySelector('div')

        // divEle.onclick = function(){
        //     console.log('这是第一个事件绑定操作');
        // }

        // divEle.onclick = function(){
        //     console.log('这是第二个事件绑定操作');
        // }

        divEle.addEventListener('click',function(){
            console.log('这是第一个事件监听操作');
        })

        divEle.addEventListener('click',function(){
            console.log('这是第二个事件监听操作');
        })
点击事件只能操作一次 后者覆盖前者

 <title>事件传播行为</title>
    <!-- 
        由内向外:事件冒泡
        由外向内: 事件捕获

        点击元素: 事件目标对象

        addEventListener的第三个参数决定了是事件捕获还是事件冒泡
           addEventListener(事件类型,事件处理函数,捕获true|冒泡false)
              => 默认冒泡false,可以不写

     -->
</head>
<body>
    <ul>
        <li>
            <p>
                <a href="#">元素一</a>
            </p>
        </li>
    </ul>

    <script>
        var aEle = document.querySelector('a')
        var pEle = document.querySelector('p')
        var liEle = document.querySelector('li')
        var ulEle = document.querySelector('ul')

        aEle.addEventListener('click',function(){
            alert('a')
        },true)
        
        pEle.addEventListener('click',function(){
            alert('p')
        },true)
        liEle.addEventListener('click',function(){
            alert('li')
        },true)
        ulEle.addEventListener('click',function(){
            alert('ul')
        },true)
        默认为冒泡 false
        true为事件捕捉

事件目标对象

!-- 
        <!-- 
        事件对象和事件目标对象
            事件对象  => 事件触发时自动创建,可以在事件处理函数中定义一个形参e来接收
            事件目标对象 => 事件对象的一个属性target获取, 表示当前点击的事件源
               => 兼容IE  
                 var target = e.target ||  e.srcElement  

        this表示当前对象
           =>在事件处理函数中的this表示的就是事件源

     -->
</head>
<body>
    <ul>
        <li>元素一</li>
    </ul>

    <script>
        var liEle = document.querySelector('li')
        liEle.addEventListener('click',function(e){
             e = e || window.event //事件对象
             var target = e.target || e.srcElement //IE兼容性写法
             console.log(target);
             console.log(target.innerHTML);
             console.log(target.nodeType,  target.nodeName);

             console.log('this ',this);


        })

事件委托

<title>事件委托</title>
    <!-- 
        事件委托
          =>元素本来由自身处理的事件,委托给它的父级元素处理,
          => 代收包裹
             
     -->
</head>

<body>
    <ul>
        <li>张三</li>
        <li>李四</li>
        <li>王二</li>
    </ul>

    <script>
        var liEles = document.querySelectorAll('li')

        // for (var i = 0; i < liEles.length; i++) {
        //     liEles[i].addEventListener('click', function (e) {
        //         e = e || window.event //事件对象
        //         var target = e.target || e.srcElement //事件目标对象

        //         alert(target.innerHTML+'本人收包裹')
        //     })
        // }

        var ulEle = document.querySelector('ul')
        ulEle.addEventListener('click', function (e) {
            e = e || window.event //事件对象
            var target = e.target || e.srcElement //事件目标对象
            if (target.innerHTML == '张三') {
                alert('收张三包裹')
            } else if (target.innerHTML == '李四') {
                alert('收李四包裹')
            } else if (target.innerHTML == '王二') {
                alert('收王二包裹')
            }
        })


什么是事件冒泡
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。



DOM事件流
DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件流。

事件顺序有两种类型:事件捕捉和事件冒泡。

阻止事件冒泡
通常情况下我们都是一步到位,明确自己的事件触发源,并不希望浏览器自作聪明、漫无目的地去帮我们找合适的事件处理程序,即我们明确最精准目标,这种情况下我们不需要事件冒泡。另外通过对事件冒泡的理解,我们知道程序将做多较多额外的事情,这必然增大程序开销。还有一个重要的问题是:事件冒泡处理可能会激活我们本来不想激活的事件,导致程序错乱,甚至无从下手调试,这常成为对事件冒泡不熟悉程序员的棘手问题。所以必要时,我们要阻止事件冒泡。

event.stopPropagation()方法

这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开,

event.preventDefault()方法

这是阻止默认事件的方法,调用此方法是,连接不会被打开,但是会发生冒泡,冒泡会传递到上一层的父元素;

return false方法

这个方法比较暴力,他会同时阻止事件冒泡也会阻止默认事件;写上此代码,连接不会被打开,事件也不会传递到上一层的父元素;可以理解为returnfalse就等于同时调用了event.stopPropagation()和event.preventDefault()


一、不阻止事件冒泡和默认事件
$(".mybj").click(function(){  
      console.log("1")//不阻止事件冒泡会打印1,页面跳转;               
}); 


二、阻止冒泡
$(".mybj a").click(function(event){  
     event.stopPropagation();//不会打印1,但是页面会跳转;              
});  
              
$(".mybj").click(function(){  
    console.log("1")                  
});


三、阻止默认事件
$(".mybj a").click(function(event){           
     //阻止默认事件  
     event.preventDefault();//页面不会跳转,但是会打印出1,  
})$(".mybj").click(function(){  
     console.log("1")});

四、阻止冒泡对比阻止默认事件
$(".mybj").click(function(){  
     console.log("1")  
});           
//阻止冒泡  
$(".mybj a").click(function(event){  
     event.stopPropagation();              
     //阻止默认事件  
     event.preventDefault() //页面不会跳转,也不会打印出1  
})

五、return false
$(".mybj").click(function(){  
     console.log("1")                  
});                                   
$(".mybj a").click(function(event){  
     return false;  //页面不会跳转,也不会打印出1,等于同时调用了event.stopPropagation()和       
     event.preventDefault()  
});
Javascript代码:

function preventBubble(event){  
  var e=arguments.callee.caller.arguments[0]||event; //若省略此句,下面的e改为event,IE运行可以,但是其他浏览器就不兼容  
  if (e && e.stopPropagation) {  
    e.stopPropagation();  
  } else if (window.event) {  
    window.event.cancelBubble = true;  
  }  
}
在哪个位置需要阻止事件冒泡,就在哪使用上面的方法:使用方法是:

preventBubble();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值