利用事件委托的原理,实现删除数组中的元素

1.事件委托

        利用事件冒泡的原理,把一个元素(子元素)的事件委托给另一个元素(上级元素).

        优点:(1) 效率高,不用循环遍历;

                (2) 可以给未来元素添加事件.

2.数组的高阶方法---filter

       作用:根据条件筛选数组的元素,筛选出满足条件的数组中的元素,组成一个新的数组返回.

       特点:返回的是一个新数组,不会改变原数组.

3.数组的高阶方法---findIndex

       作用:查找数组中第一个满足条件的数组元素的下标,如果有,就返回这个元素的下标;反之,就返回-1.

        特点:(1) 参数是一个函数,参数有三个形参,第一个参数是数组中的元素,第二个参数是元素的下标,第三个参数是原数组.

                (2) 不会改变原数组.

4.数组的常用方法---splice

        作用:根据索引删除数组中的某个元素.

        语法:splice(从哪一索引位置开始,删除多少个,替换的新元素)

        注意:(1) 第三个参数可以不写
                (2) splice是删除数组中 任意位置的元素

第一种方法:事件委托+filter

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>今日待办事项</h1>
    <ul>
      <!-- <li>
      <p>完成家庭作业</p>
      <button>删除</button>
    </li> -->
    </ul>

    <script>
      //1.定义一个数组,存储数据
      var arr = [
        { id: 1, title: '完成家庭作业' },
        { id: 2, title: '看电视' },
        { id: 3, title: '洗漱睡觉' },
      ];
      //3.调用函数
      renderList();

      var ul = document.querySelector('ul');
      //4.利用事件委托的原理,原本给删除按钮添加点击事件,因为删除按钮的父元素是ul,因此改为给ul添加点击事件
      ul.onclick = function (evt) {
        console.log(evt.target);
        //5.判断事件对象的事件源的类名
        if ((evt.target.className = 'del')) {
          console.log('点击了删除按钮');
          //6.获取自定义属性id
          var id = evt.target.dataset.id;
          console.log(id);
          //7.使用filter筛选数组中满足条件的元素
          /* filter返回的是一个新数组,它不会改变原数组 */
          arr = arr.filter(function (v) {
            return v.id != id;
          });
          console.log(arr);
          //8.重新渲染页面,再次调用函数
          renderList();
        }
      };
      // 2.将数组中的数据渲染到ul中,将其封装成一个函数
      function renderList() {
        //定义一个空的字符串
        var str = '';
        //获取ul元素
        var ul = document.querySelector('ul');
        //循环遍历数组
        arr.forEach(function (obj) {
          //使用模板字符串渲染数据
          var liStr = `
          <li>
              <p>${obj.title}</p>
              <button class="del" data-id="${obj.id}">删除</button>
          </li>
      `;
          //将渲染数据累加到空字符串上
          str += liStr;
          //将字符串的内容赋值给ul
          ul.innerHTML = str;
        });
      }
    </script>
  </body>
</html>

第二种方法:事件委托+findIndex

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>今日待办事项</h1>
    <ul>
      <!-- <li>
      <p>完成家庭作业</p>
      <button>删除</button>
    </li> -->
    </ul>

    <script>
      //1.定义一个数组,存储数据
      var arr = [
        { id: 1, title: '完成家庭作业' },
        { id: 2, title: '看电视' },
        { id: 3, title: '洗漱睡觉' },
      ];
      //3.调用函数
      renderList();

      var ul = document.querySelector('ul');
      //4.利用事件委托的原理,原本给删除按钮添加点击事件,因为删除按钮的父元素是ul,因此改为给ul添加点击事件
      ul.onclick = function (evt) {
        console.log(evt.target);
        //5.判断事件对象的事件源的类名
        if ((evt.target.className = 'del')) {
          console.log('点击了删除按钮');
          //6.获取自定义属性id
          var id = evt.target.dataset.id;
          console.log(id);
          //7.使用findIndex查找满足条件的一个元素的下标
          var i = arr.findIndex(function (v) {
            return v.id == id;
          });
          console.log(i);
          //8.使用splice方法进行删除
          arr.splice(i, 1);
          //9.重新渲染页面,再次调用函数
          renderList();
        }
      };
      // 2.将数组中的数据渲染到ul中,将其封装成一个函数
      function renderList() {
        //定义一个空的字符串
        var str = '';
        //获取ul元素
        var ul = document.querySelector('ul');
        //循环遍历数组
        arr.forEach(function (obj) {
          //使用模板字符串渲染数据
          var liStr = `
          <li>
              <p>${obj.title}</p>
              <button class="del" data-id="${obj.id}">删除</button>
          </li>
      `;
          //将渲染数据累加到空字符串上
          str += liStr;
          //将字符串的内容赋值给ul
          ul.innerHTML = str;
        });
      }
    </script>
  </body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值