javascript 事件冒泡和事件代理
事件冒泡
简单的讲,当子元素的事件处理函数被触发(如onclick),该事件会从事件源(当前子元素)逐级向上层元素传递,触发祖先元素的 onclik 事件,一直到最外层 html 根元素。
这可能会带来困扰,不必要的事件处理函数被执行了,不过我们可以阻止事件冒泡。事件触发时,会传入一个event对象,它有一个 stopPropagation() 方法可以阻止事件冒泡。
事件冒泡机制当然也有有利的一面,事件代理就是基于浏览器的事件冒泡机制。
事件代理
事件代理也叫事件委托,当我们需要为父元素的很多子元素添加事件时,可以通过把事件添加到父元素并把事件委托给父元素来触发事件处理函数。
在开发中,我们有时会遇到给列表每一个子元素都添加一个事件,可以用遍历来操作,这种方法固然简单,但是如果这个列表有巨量的子元素的时候,就要消耗大量的性能,并且当子元素需要新增的时候,每增加一个子元素就需要遍历一次,这种方法就更不可取。
事件委托不仅实现相同了功能,而且大大减少了DOM操作。
<ul class="wrap">
<li class="item">1111<button>删除</button></li>
<li class="item">2222<button>删除</button></li>
<li class="item">3333<button>删除</button></li>
<li class="item">4444<button>删除</button></li>
<li class="item">5555<button>删除</button></li>
</ul>
<button class="add">添加子元素</button> <script>
let oWrap = document.getElementsByClassName('wrap')[0];
let oItem = document.getElementsByClassName('item');
let oAdd = document.getElementsByClassName('add')[0]; oWrap.addEventListener('click',function(e){
//判断事件目标元素是否为 li ,并显示它的第一个子节点的文本内容
if(e.target && e.target.nodeName.toLowerCase() == 'li'){
console.log(e.target.childNodes[0].textContent);
} //判断事件目标元素是否为 button ,删除它的父元素
if(e.target && e.target.nodeName.toLowerCase() == 'button'){
oWrap.removeChild(e.target.parentNode);
}
}) //添加子节点
oAdd.addEventListener('click',function () {
let oLi = document.createElement('li');
oLi.setAttribute('class','item');
oLi.innerHTML = oItem.length+1+'<button>删除</button>';
oWrap.appendChild(oLi);
})
</script>
javascript 事件冒泡和事件代理的更多相关文章
- 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理
原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...
- javascript中的事件冒泡、事件捕获和事件执行顺序
谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...
- javascript --- 事件冒泡与事件捕获
事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题.考虑下面这段代码,就不写html->head,body之类的代码了,自行 ...
- JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获
先看下面的示例代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Jav ...
- JavaScript事件冒泡和事件委托
JavaScript事件冒泡和事件委托 付建宇 - 2 条评论 接触JavaScript不久,学的东西也不是特别多.小雨就是习惯把平时学到的东西拿出来分享.一方面加强自己的印象,一方面可以让自己的经验 ...
- javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。
首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...
- JavaScript中的事件冒泡?事件传播的解释
注:本文来源 可译网 事件冒泡是你在学习javaScript旅途中遇到的一个术语,它涉及到当一个元素被另一个元素嵌套时调用事件处理的顺序,并且两个元素注册了同一个事件(例如,点击事件). 但是事件冒 ...
- JavaScript(3)---事件冒泡、事件捕获
JavaScript(3)---事件冒泡与事件捕获 一.理解冒泡与捕获 假设有这么一段代码 <body> <div><p>标签</p> </div ...
- 【JavaScript】事件捕获、事件冒泡与事件委托
2018年12月18日 最近在学习js时,遇到了三个名词:事件捕获.事件冒泡.事件委托. 一.事件捕获和事件冒泡 事件捕获和事件冒泡是为了解决网页中的事件流(事件发生的顺序)而提出的概念. 事件捕获是 ...
随机推荐
- Win32 Ime
Win32 Ime API: ImmGetContext: 获取指定窗口的当前的输入上下文,然后再尝试访问上下文中的信息.应用程序应该定期使用这个功能获取窗口的当前的输入上下文.若hWnd参数为零,将 ...
- centos基本命令
$>ls $>ls --help //查看命令帮助 $>man ls //查看命令帮助 $>clear //清屏 $>cd /home //切换目录 $>cd . ...
- 【夯实shell基础】shell基础面面观
本文地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. shell中的函数 2. shell中的数组 3. shell中的变量 4. shell中的运算符 5. Linux的一些命 ...
- MySQL 系列
阅读目录 第一篇:初识数据库 第二篇:库操作相关 第三篇:表相关操作 第四篇:记录相关操作 第五篇:数据备份.pymysql模块 第六篇:视图.触发器.事务.存储过程.函数 第七篇:ORM框架SQLA ...
- day20 hashlib、hmac、subprocess、configparser模块
hashlib模块:加密 import hashlib# 基本使用cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8'))print(cipher.h ...
- Tree 和ls 的使用
再次声明:linux下的文件系统采用树的结构实现的 我们 可以安装 Tree 软件 在当前目录下(随便一个当前目录下)输入 tree 命令,我们可以看到整个当前文件目录下的目录以及文件的树状结构,这也 ...
- SQL Server 2017连接数据库
1.服务器类型需为[数据库引擎] 若为[Analysis Services],连接后是无法建立数据库的. 2.需确定服务器名称,未显示已注册的服务器,则需: (1)请在“视图”菜单中,单击“已注册的服 ...
- iOS App上架流程(2016详细版)来源DeveloperLY
一.前言: 作为一名iOSer,把开发出来的App上传到App Store是必要的.下面就来详细讲解一下具体流程步骤. 二.准备: 一个已付费的开发者账号(账号类型分为个人(Individual).公 ...
- Anaconda安装及使用
前言 在Linux系统上一般会预安装python,但有时候版本过低,通过apt或yum无法安装较新的python版本,只能通过编译python源码进行安装.然而通过源码安装会依赖大量的库,手动安装这些 ...
- laravel 定义翻译字符串
https://learnku.com/docs/laravel/5.6/localization/1376 // 全景链接$data['share_phone'] = trans('web.host ...