美文网首页
事件代理

事件代理

作者: 饥人谷_醉眼天涯 | 来源:发表于2017-09-23 15:06 被阅读0次

事件代理: 利用事件冒泡,把事件监听绑定到事件容器上。应用场景就是页面上有一些新增的元素,这些元素也都是需要绑定事件的。
举列说明: 这个列子实现的效果是,点击li,能够把li的文本显示在下方,同时点击添加按钮,能添加进新的文本。

<style>
        .container {
            margin: 30px auto;
            width: 900px;
        }
        ul, li {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        ul {
            background: pink;
        }
        .container li {
            border: 1px solid #ccc;
            line-height: 1.5;
            margin-right: 30px;
        }
        #show {
            background: #ccc;
        }
    </style>
---------
<body>
    <div class="container">
        <ul>
            <li>aa</li>
            <li>bb</li>
            <li>cc</li>
            <li>dd</li>
        </ul>
        <input type="text" id="add-input"><button id="btn">添加</button>
        <div id="show"></div>
    </div>
         <script>
var liNodes = document.querySelector('.container li');
var oDiv = document.querySelector('#show');
liNodes.forEach(function() {
console.log(this);      // window
 this.addEventListener('click', function() {
 oDiv.innerText = this.innerText;
}, false);
})
   </script>

此时点击li出现"undefined", 而并不是文本内容,查看控制台,this此时指代的window。下面就不用this,而是通过传参的方式。修改代码如下。

liNodes.forEach(function(node) {
console.log(node);     
 node.addEventListener('click', function() {
 oDiv.innerText = this.innerText;
}, false);
})
 // 此时得到就是li标签了,同时点击也会在下面显示li文本内容。

// 添加文本内容的代码

var oBtn = document.querySelector("#btn");
var addText = document.querySelector("#add-input");
var oUl = document.querySelector(".container ul");
oBtn.addEventListener('click', function() {
var node = document.createElement('li');
node.innerText = addText.value;
oUl.appendChild(node);
}, false);

此时点击添加按钮,能够添加上新的文本,但是点击新增的li,并不会把文本内容给显示出来。修改代码,并且将两部分合并起来。

<script>
        var liNodes = document.querySelectorAll('.container li');
        var oBtn = document.querySelector('#btn');
        var oDiv = document.querySelector("#show");
        var addText = document.querySelector("#add-input");
        var oUl = document.querySelector(".container ul");
        liNodes.forEach(function(node) {
            console.log(node);
            node.addEventListener('click', function() {
                oDiv.innerText = this.innerText;
            }, false)
        });
        oBtn.addEventListener('click', function() {
            var node = document.createElement('li');
              /*  修改的地方,新添加的li,即node也要添加点击事件,
才能达到效果。*/
            node.addEventListener('click', function() {
                oDiv.innerText = this.innerText;
            }, false)
            node.innerText = addText.value;
            oUl.appendChild(node);
        }, false);
</script>

但是上面写的太过繁琐。事件冒泡,即我们无论是点击哪一个li,都会冒到父容器ul上,所以我们直接给ul,添加点击事件。

// 事件代理的写法
oUl.addEventListener('click', function(e) {
            var target = e.target || e.srcElement;  // 获取事件的目标元素
// 加if条件判断是为了,防止点击ul里除了li的空白处,会触发点击事件。
            if(target.tagName.toLowerCase() === 'li') {  
                oDiv.innerText = target.innerText;
            }
        }, false);
oBtn.addEventListener('click', function() {
            var  newNode = document.createElement('li');
            newNode.innerText = addText.value;
            oUl.appendChild(newNode);
        }) 

相关文章

  • 第二十天web前端面试题

    1,什么是事件代理且描述事件代理的原理及为什么要用事件代理? 事件委托也叫事件代理。利用事件冒泡,让自己的触发的事...

  • 概念

    事件委托,事件代理 事件代理又称之为事件委托。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理...

  • Block和代理协议

    代理协议: 1.要确定谁是代理对象,谁是被代理对象。 事件在哪里产生,谁就被代理对象。 事件在哪里响应,谁就是代理...

  • dom事件代理

    实现一个js事件代理的模块,帮助用户快速实现事件代理。

  • 【事件代理】 动态数据列表里,如何监听每条数据的点击?

    前言 在问题前,需要先清楚关于事件冒泡、事件代理的定义 事件冒泡 事件代理 原理: 事件冒泡机制实现方式:可用ad...

  • 前端面试题套路

    套路一:事件代理 1、事件代理基本原理 事件代理的基本原理简单来说就是将子元素的事件通过冒泡的形式交由父元素来执行...

  • 事件代理

    1.问题描述 双击文章栏目中的单词可以添加到生词栏目中,我们可以给每个单词添加一个dblclick事件,那么这里就...

  • 事件代理

    javascript和jQuery的事件代理不同写法 首先思考一下:为什么我们要用到事件代理??? 举个栗子父元素...

  • 事件代理

    简单情况的事件代理写法 假设是这个么结构,然后现在要监听的是 父容器 ul : 那么我们的监听代码可以这么写: 点...

  • 事件代理

    事件代理(事件委托):利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。 事件委托就是利用冒泡...

网友评论

      本文标题:事件代理

      本文链接:https://www.haomeiwen.com/subject/ihecextx.html