事件操作方式

news/2024/7/5 19:19:03 标签: javascript, 前端, vue.js
<!-- 
        操作事件
           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();

http://www.niftyadmin.cn/n/1146327.html

相关文章

国产Office有望替代微软Office

近日&#xff0c;中国无锡的永中科技有限公司推出了最新版办公软件??EIOffice 2009&#xff0c;这款办公软件不仅仅基于一种中国政府大力推广的UOF文件格式&#xff0c;而且其价格也仅仅是微软公司提供的Office的一小部分。由于微软产品长期以来对办公软件的垄断&#xff0c;…

【软考】软件攻城狮考试(七)——语言基础

一、秋风扫落叶 ”以明公之威&#xff0c;应困穷之敌&#xff0c;击疲弊之寇&#xff0c;无异迅风之振秋叶矣“&#xff0c;随着我们前进的步伐&#xff0c;软考就想落叶一样&#xff0c;被我们清扫掉了。在程序员的道路上&#xff0c;最经常打交道的就是代码了&#xff0c;但是…

事件传播行为

<!-- 由内向外&#xff1a;事件冒泡由外向内: 事件捕获点击元素&#xff1a; 事件目标对象addEventListener的第三个参数决定了是事件捕获还是事件冒泡addEventListener(事件类型&#xff0c;事件处理函数,捕获true|冒泡false)> 默认冒泡false,可以不写-->默认行为 &…

【软工】软件工程(五)——高内聚低耦合

一、前言 模块独立是指每个模块完成一个相对独立的特定子功能&#xff0c;并且与其他模块之间的联系简单。而衡量模块独立的标准就是&#xff1a;耦合性和内聚性。我们要做到模块间的高内聚和低耦合。 二、耦合 耦合指的是模块间的联系紧密程度。 低耦合~~ 图一 耦合非直接耦合…

番茄花园版Windows XP作者被拘留!

番茄花园美化修改版Windows XP的作者、软件下载网站番茄花园(tomatolei.com)站长洪磊的父亲19日晚22:50日(上周五)被警 方拘留审查&#xff0c;网站被关闭&#xff0c;服务器及洪磊的笔记本被警方带走&#xff0c;为洪磊提供的技术开发支持的成都红果科技有限公司也被查封。洪磊…

【IT】我是计算机系统大师(三)——高速缓存地址映射方式

一、前言 计算机系统结构是站在程序员的角度所看到的计算机数学&#xff0c;即程序员要能编写出可以在计算机上正确运行的程序必须了解概念结构和功能特性。 二、对比介绍 直接映像 图一 直接映像主存一块只能映像到Cache的一个特定块中。 1 VS 1 优点&#xff1a;地址变换…

大连市三大行业人才需求旺盛

近日&#xff0c;大连人才市场公布了上半年人才需求情况&#xff0c;装备制造、&#xff29;&#xff34;、批发与零售贸易行业成为最热门的招聘行业。其次的热门行业是&#xff1a;金融&#xff0f;保险业、教育&#xff0f;培训业、化工&#xff0f;医药制造业和房地产业、食…

arguments伪数组

// function fn(x,y){// console.log( arguments ); // 存储所有实参的集合&#xff0c;是一个伪数组// }// fn(10,20,30)function fn(x,y,z){console.log( arguments )}fn(10,20,30,40)Arguments(4) 0: 10 1: 20 2: 30 3: 40 callee: ƒ fn(x,y,z) length: 4 Symbol(Symbo…