JS中如何巧妙的用事件委托
常见场景:页面有多个相同的按钮需要绑定同样的事件逻辑。
如下HTML,实现:点击每个按钮,当它的 data-id不为null的时候输出它的data-id(实际业务中会有更复杂的逻辑)
<ul id="parent">
<li class="btn" data-id="1">按鈕1</li>
<li class="btn" data-id="2">按鈕2</li>
<li class="btn" data-id="null">按鈕3</li>
<li class="btn" data-id="3">按鈕4</li>
<li class="btn" data-id="null">按鈕5</li>
</ul>
实现方案一:(缺点 1 for循环影响性能,2每次循环都会在内部创建一个事件,3 如果 li 是动态追加的会导致事件失效。)
var btns=document.getElementsByClassName("btn");//扩展 可以有多种获取DOM方法
for(var i=0;i<btns.length;i++){
btns[i].onclick=function(){
var id=this.getAttribute("data-id");
if(id!="null"){
console.log(id);
}
}
}
实现方案二:(解决了方案一种的2,3缺点,但是还有for循环!IOS下事件委托失效解决方案)
var btns=document.getElementsByClassName("btn");
function handleClick(){
var id=this.getAttribute("data-id");
if(id!="null"){
console.log(id);
}
}
for(var i=0;i<btns.length;i++){
btns[i].addEventListener("click",handleClick,false);
}
实现方案三:(完美解决方案1种的所有缺点)
涉及知识点:addEventListener,event
var parent=document.getElementById("parent");
function handleClick(){
var e=window.event||arguments[0];
var target=e.srcElement||e.target;
if(target.nodeName.toLowerCase() == 'li'){
var id=target.getAttribute("data-id");
if(id!="null"){
console.log(id);
}
}
}
parent.addEventListener("click",handleClick,false);
方案三的升级版:注册绑定事件方便复用
// 1、通用綁定事件
function bind(elem,eventType,callback){
if(elem.addEventListener){
elem.addEventListener(eventType,callback,false);
}else{
elem.attachEvent("on"+eventType,function(){
callback.call(elem);
});
}
} var parent=document.getElementById("parent");
function handleClick(){
var e=window.event||arguments[0];
var target=e.srcElement||e.target;
if(target.nodeName.toLowerCase() == 'li'){
var id=target.getAttribute("data-id");
if(id!="null"){
console.log(id);
}
}
}
bind(parent,"click",handleClick);
JS中如何巧妙的用事件委托的更多相关文章
- js事件、Js中的for循环和事件的关系、this
一.js事件 1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmo ...
- vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结
vue—你必须知道的 目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...
- JS中的DOM操作和事件
[DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:可以使用getElement系列方法, ...
- js中一次性注册多个事件
在js中,如果想一次性给一个控件或者标签初测多个事件的方法: 假如有个<input>标签: <input id=”inputValue” value=”www.baidu.com”/ ...
- js中按下回车触发事件
方法一:document.onkeydown = function (e) { // 回车提交表单// 兼容FF和IE和Opera var theEvent = window.event || e; ...
- js中容易被忽视的事件问题总结
一:跨平台事件 什么叫跨平台事件?即在不同的浏览器上执行同一事件,所使用的方法不同. 什么是EventUtil对象?有什么作用?即将所有与事件相关的函数,融合在一起的一个容器,方便管理事件对象,它没有 ...
- Js中的onblur和onfocus事件
html页面中,诸如按钮.文本框等可视元素都具有拥有和失去焦点的事件,这些事件在响应鼠标或键盘动作时都可激发预设的操作.本文以文本框获得和失去焦点为例简单讲解onfocus和onblur的应用. 一. ...
- Js中的onblur和onfocus事件应用介绍
html页面中,诸如按钮.文本框等可视元素都具有拥有和失去焦点的事件,本文以文本框获得和失去焦点为例简单讲解onfocus和onblur的应用 html页面中,诸如按钮.文本框等可视元素都具有拥有和失 ...
- js中for循环点击事件(闭包)
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
随机推荐
- 【Git】 自动化Maven项目构建脚本(二)
这次脚本增加了构建选择,可以按需构建了. #!/bin/bash #----------------------------------------------- # FileName: auto-b ...
- 【Linux】新建用户 用户组
案例 hadoop #添加用户组 sudo useradd -s /bin/bash -g hadoop -d /home/hadoop -m hadoop #添加用户 sudo passwd h ...
- java web轻量级开发面试教程读书笔记:建索引时我们需要权衡的因素
场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大.当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于"性价比"不高. ...
- mysql简单主从复制(二)
mysql的简单主从复制 主从复制打开后,各自开启的线程: master端 mysql> show processlist\G; *************************** 1. r ...
- 基于.netstandard的权限控制组件
基于.netstandard的权限控制组件 Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目基于 .NETStan ...
- v-cloak 实现vue实例未编译完前不显示
前言: 由于网速原因,(ps:之前同事无意间在网速很差的情况下测出的)在使用vue开发时,会由于vue实例还没编译成功的时候数据绑定的"Mustache"标签会闪现一下,造成不好的 ...
- APPIUM 输入中文 之套路
java appium 在Capabilities 中添加 capabilities.setCapabilities("unicodeKeyboard",true);和 capa ...
- selenium,html高宽设置成了0,会影响元素可见性,怎么手动修改某个元素的高宽?
问题:要js的话,需要用webelment,此时元素已经是不可见了 ((JavascriptExecutor) this.driver).executeScript("argument ...
- MySql数据库导入导出
1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 存放位置 比如: mysqldump -u root -p project > c:/a. ...
- Spark 1.6升级2.x防踩坑指南
原创文章,谢绝转载 Spark 2.x自2.0.0发布到目前的2.2.0已经有一年多的时间了,2.x宣称有诸多的性能改进,相信不少使用Spark的同学还停留在1.6.x或者更低的版本上,没有升级到2. ...