zoukankan      html  css  js  c++  java
  • 事件委托

    认真看,每个人都可以看懂的-_-也可以结合js高级程序设计第三版一起看哦~

    什么是事件委托--官方解释
    对“事件处理程序过多”问题的解决方案就是事件委托。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。例如,click 事件会一直冒泡到 document 层次。也就是说,我们可以为整个页面指定一个 onclick 事件处理程序,而不必给每个可单击的元素分别添加事件处理程序

    下面一句话很重要!很重要!很重要!
    只要进行了点击就是会有捕获阶段->目标阶段->冒泡阶段三个阶段,和你在哪个阶段去添加事件处理程序无关
    意思就是只要有点击,都会有着三个阶段,不管是有没有绑定事件

    事件委托主要是利用了冒泡,假如我用鼠标点击了box2,第三阶段是冒泡阶段 ,会从 id为box2的li标签-->ul-->body-->html-->window
    说明我不管是点击box1,box2,还是box3 都会经历 boxn -->ul-->body-->html-->window的过程,所以我们可以在li的上一级ul添加一个事件处理程序,因为event里面会有一个target我们获取获取到目标元素
    event.target 和 event.currentTarget有什么区别?
    event.target表示的目标元素,事件捕获到最底层的那个元素,event.currentTarget表示的是监听元素,这里指的就是addEventListener监听的那个元素

       <ul id="mylinks">
            <li id="box1">box1</li>
            <li id="box2">box2</li>
            <li id="box3">box3</li>
        </ul>
    

    1为什么需要事件委托?
    如果我点击父元素底下很多个li标签,每个点击做不同的操作,那么结果就会有数不
    清的代码用于添加事件处理程序

        <ul id="mylinks">
            <li id="box1">box1</li>
            <li id="box2">box2</li>
            <li id="box3">box3</li>
        </ul>
    </head>
    <body>
        <script>
            // 因为冒泡事件是逐级向上冒泡的 所以在最高级去添加一个事件就好 dom2写法
            //需求:点击每一个做不同的操作,如果这里有无数个li 要写100种写法
            var box1 = document.getElementById('box1')
            var box2 = document.getElementById('box2')
            var box3 = document.getElementById('box3')
            box1.addEventListener('click', ()=> {
                console.log('box1');
            })
            box2.addEventListener('click', ()=> {
                console.log('box2');
            })
            box3.addEventListener('click', ()=> {
                console.log('box3');
            })
        </script>
    

    如果我用事件委托

       <ul id="mylinks">
            <li id="box1">box1</li>
            <li id="box2">box2</li>
            <li id="box3">box3</li>
        </ul>
    </head>
    <body>
        <script>
            var bigBox = document.getElementById('mylinks')
            bigBox.addEventListener('click', (event)=> {
                var target = event.target
                switch (target.id) {
                    case 'box1':
                        document.title = 'box1'
                        console.log(document.title);    
                        break;
                    case 'box2':
                        document.title = 'box2'
                        console.log(document.title);    
                        break;
                    case 'box3':
                        document.title = 'box3'
                        console.log(document.title);    
                        break;
                }            
            })
    

    在js高级程序设计中是这样写的

     <ul id="mylinks">
            <li id="box1">box1</li>
            <li id="box2">box2</li>
            <li id="box3">box3</li>
        </ul>
    </head>
    <body>
        <script>
              <ul id="mylinks">
            <li id="box1">box1</li>
            <li id="box2">box2</li>
            <li id="box3">box3</li>
        </ul>
    </head>
    <body>
        <script>   
            // 因为冒泡事件是逐级向上冒泡的 所以在最高级去添加一个事件就好 dom2写法
            //需求:点击每一个做不同的操作,如果这里有无数个li 要写100种写法、
            let EventUtil = {
                getEvent: function(event){ 
                    return event ? event : window.event; 
                },
                getTarget: function(event){ 
                    return event.target || event.srcElement; 
                }
            }
            var bigBox = document.getElementById('mylinks')
            bigBox.addEventListener('click', (event)=> {
                event = EventUtil.getEvent(event); 
                var target = EventUtil.getTarget(event);  
                var target = event.target
                switch (target.id) {
                    case 'box1':
                        document.title = 'box1'
                        console.log(document.title);    
                        break;
                    case 'box2':
                        document.title = 'box2'
                        console.log(document.title);    
                        break;
                    case 'box3':
                        document.title = 'box3'
                        console.log(document.title);    
                        break;
                }            
            })
    </script>
    

    书上有提到--IE 中 event 对象的全部信息和方法 DOM 对象中都有
    这里是采用的兼容写法---主要是因为获取这个event和event.target的方式不一样

    2.事件委托的好处
     document 对象很快就可以访问,而且可以在页面生命周期的任何时点上为它添加事件处理程序(无需等待 DOMContentLoaded 或 load 事件)。换句话说,只要可单击的元素呈现在页面上,就可以立即具备适当的功能。
     在页面中设置事件处理程序所需的时间更少。只添加一个事件处理程序所需的 DOM 引用更少,所花的时间也更少。
     整个页面占用的内存空间更少,能够提升整体性能。

  • 相关阅读:
    谈谈架构层级的“开闭原则”
    将MySQL数据库中的表结构导入excel 或word
    淘宝网-软件质量属性分析
    架构漫谈阅读有感
    机器学习-分类算法之决策树、随机森林
    机器学习-分类算法之逻辑回归
    机器学习-朴素贝叶斯算法
    机器学习-分类算法之k-近邻
    机器学习-模型选择
    机器学习-scikit-learn数据集
  • 原文地址:https://www.cnblogs.com/antyhouse/p/12298932.html
Copyright © 2011-2022 走看看