正确效果:

先看结构

HTML

<div class="box-head"><ul class="tab"><li class="tab-active">测试<span class="iconfont"></span></li><li>测试<span class="iconfont"></span></li><li>测试<span class="iconfont"></span></li></ul><button class="tab-add">+</button></div>

一般在写这种新增元素的案例时,经常会出现新增元素无法绑定事件的情况,在我第一次写时代码是这样的

JS

 var tab = document.querySelector(".tab")var li = tab.querySelectorAll("li")var add = document.querySelector(".tab-add")for (var i = 0; i < li.length; i++) {var del = li[i].querySelector("span")del.onclick = function () {this.parentNode.remove()}}add.onclick = function () {var newLi = '<li>新增节点<span class="iconfont"></span></li>'tab.insertAdjacentHTML("beforeend", newLi)}

这样出现的效果就是无法给新增元素动态的绑定事件

在学习事件监听addEventListener后,我想着应该是在原来js的基础上,将onclick改为由del的父元素li绑定单击事件,再冒泡到子元素del去
像这样

二改JS

 var tab = document.querySelector(".tab")var li = tab.querySelectorAll("li")var add = document.querySelector(".tab-add")// 改变的是这些for (var i = 0; i < li.length; i++) {li[i].addEventListener("click", function (e) {if (e.target.nodeName.toLowerCase() == "span") {e.target.parentNode.remove()}})}add.onclick = function () {var newLi = '<li>新增节点<span class="iconfont"></span></li>'tab.insertAdjacentHTML("beforeend", newLi)}

发现还是无法给新增元素绑定删除事件
原因是在给各个li绑定前的for循环

for (var i = 0; i < li.length; i++)

这个li.length是页面一加载就运行的,相当于还是3个li
这样就一直无法追加绑定新增元素了

这里转变思路,将父元素绑定事件由 li[i] 改为只有一个的祖先元素

最终JS

 var tab = document.querySelector(".tab")var li = tab.querySelectorAll("li")var add = document.querySelector(".tab-add")// 改变的是这些tab.addEventListener("click", function (e) {if (e.target.nodeName.toLowerCase() == "span") {e.target.parentNode.remove()}})add.onclick = function () {var newLi = '<li>新增节点<span class="iconfont"></span></li>'tab.insertAdjacentHTML("beforeend", newLi)}

最后效果


所以以后遇到事件委托,最好给已经固定好的父元素绑定事件
这里要注意的是

 if (e.target.nodeName.toLowerCase() == "span") {e.target.parentNode.remove()}

里面改动的不是this.parentNode.remove()
这个指向问题需要小心

相比之下如果是jq下完成此效果就简单多了

 $(".tab-add").on("click", function () {var newLi = '<li>测试<span class="iconfont"></span></li>';$(".tab").append(newLi);})$(".tab").on("click", "span", function () {$(this).parent().remove();})

jq中on方法有点像js中的事件监听addEventlistener,但是addEventlisten没有给子元素事件委托的参数

最后总结一下
在js中给新增元素动态绑定事件是利用addEventlistener给固定不变的父元素(或祖先元素)绑定事件,再冒泡具体子元素上,这里用到的是e.target。
jq就用on方法

浅谈js与jq给新增元素动态绑定事件(事件委托)相关推荐

  1. 浅谈 -- ♡ ‧₊˚ JS 与JQ的区别 ‧₊˚ ♡

    jQuery是一个Javascript库,是对于ECMAScript.dom.bom的一个浅封装,让用户更方便操作. 让我们简单谈谈JS与JQ的区别吧! ♡ ‧₊˚  定义  ‧₊˚ ♡ js是网页的 ...

  2. 浅谈JS中常见的问题(三)

    往期文章目录 浅谈JS中常见的问题(一) 浅谈JS中常见的问题(二) JS知识总结 往期文章目录 前言 11. 同步和异步的区别 12. JS 判断变量类型的几种方法 13. 如何阻止事件冒泡与默认事 ...

  3. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 123,123.456,0xff 之类的数字格式. 其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有 ...

  4. php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

  5. 浅谈js原型和原型链

    一.简述 对于javascript 对象(函数) 原型和原型链的理解,其实不那么难,简单来说,需要理解什么是原型,怎么访问原型,什么是原型链,怎么通过原型链去访问原型,就可以大概理清楚原型和原型链的基 ...

  6. 浅谈js执行的AO/VO

    浅谈AO/VO详解 首先说明一下AO和VO的含义 AO:Activive Object,即函数的活动对象. VO:Variable Object,即变量对象. 它们的作用是帮助js引擎在引用变量的时候 ...

  7. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  8. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  9. 浅谈js的常用继承封装和多态

    好久没有写博客了,以前对js的继承都很模糊,最近重新整理了些资料重新温习了一下! 首先什么是构造函数?什么是原型?什么是实例化对像?,继承和实例化对象有什么区别?继承方式有哪些?各自有什么区别和优缺点 ...

最新文章

  1. C++中const指针用法汇总
  2. 关于Spring Cloud 框架热部署的方法
  3. 【Quartz】Quartz
  4. 皮一皮:傻傻分不清,这究竟是教室还是...
  5. 机器人学习--从路径规划侧面看栅格地图
  6. 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...
  7. SpringBoot中处理的转发与重定向
  8. 公网对讲机修改对讲机程序_更少的对讲机,对讲机-更多专心,专心
  9. 初识 TensorFlow 旅程之一
  10. python 调用apollo
  11. Float,Double单双精度在线转换成二进制
  12. Java的线程在哪个地方执行,Java多线程
  13. 每逢看牙好怕怕,AI 轻松搞定它
  14. 【51单片机】 蜂鸣器发声程序
  15. 经济学积累(二)一些经济学词汇及概念
  16. Springmvc中文乱码问题
  17. G6-定制不同节点的参数 --组合图
  18. 哔哩哔哩(B站)暑期实习面经(已OC)
  19. matlab中在同一图形窗口中绘制出一个周期内的正弦曲线和余弦曲线,多选(3分) 在一个图形窗口同时绘制[0,2π]的正弦曲线、余弦曲线,可以使用命令( )。...
  20. ANDROID中的VOLD分析

热门文章

  1. 2017年个人工作总结
  2. SSH 无法启动的原因分析及解决方法
  3. 算法总结之 数组的partition调整
  4. revit API 实现可停靠窗口
  5. 熟悉相关电路,控制I/O口,且配置相关参数,LED,光敏,74LS164数码管
  6. LeetCode -- Perfect Squares
  7. 利用conda安装git
  8. 对TCP/IP协议的一些看法(13):IP路由
  9. Kubernetes面试题
  10. 编译fastdfs报错Makefile:59: recipe for target 'fdfs_monitor' failed