web中的事件委托
程序员文章站
2022-05-06 09:45:50
...
在前端开发中,我们经常碰到这样的应用场景,用列表(ul和li)展示许多条相似的数据,而且每条数据(dom)上都有类似的事件操作,例如线上商城购物车、招聘网站中招聘信息的展示等等,点击每条信息展示详细内容。如下图所示:
其代码如下:
如果在ul中的每个li都添加一个点击事件,不仅不方便,而且会影响网页性能。解决方法就是使用事件委托来定义点击事件。
事件委托的根本是根据浏览器事件的冒泡原理,简单复习一下这个概念。
1、事件捕获和冒泡的历史由来
浏览器发展到第四代,出现了一个有意思的事情,浏览器的哪一部分会拥有特定事件。例如:有如下代码,
<div id="main">
<button id="btn1">按钮1</button>
</div>
当点击按钮1时,是div先接收到事件,还是button先接收到事件?
当时出现两种设计方案,即事件捕获和冒泡。
2、事件捕获
最外层最先接收事件,以上面代码为例,接收事件顺序即document->html->body->div->button.
3、事件冒泡
事件冒泡和事件捕获相反,最内层最先接收事件,接收事件顺序即button->div->body->html->document。
几乎所有浏览器都支持事件冒泡,早期版本的浏览器可能不支持事件捕获,所以在应用中,如需兼容早期版本浏览器,尽量使用事件冒泡。或使用DOM0级事件处理程序方法监听事件。
所以,用ul和li展示许多条数据时,li上的事件最终会冒泡到ul,我们只需要监听ul的点击事件,最后判断点击的是哪个li,即可完成事件监听。不啰嗦,上代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<ul id="main">
<li>NO.1</li>
<li>NO.2</li>
<li>NO.3</li>
<li>NO.4</li>
<li>NO.5</li>
<li>NO.6</li>
<li>NO.7</li>
</ul>
<script>
let main = document.querySelector('#main');
console.log(main);
//ul处理函数,
function handler(e){
let event = e||window.event;
//可以获取到具体是哪个li被点击,target是li的dom对象
let target = event.target;
//被点击的li背景设为红色
target.style.background = 'red';
console.log(target);
}
main.addEventListener('click',handler,false);
</script>
</body>
</html>
结果如下:
NO.2和NO.4被点击,背景色变红。
事件委托就介绍到这,欢迎大家批评指正。
推荐阅读
-
jquery中交替点击事件的实现代码
-
css中应该滚瓜烂熟的属性_html/css_WEB-ITnose
-
div+csS中的一些技巧和浏览器兼容的办法_html/css_WEB-ITnose
-
JS中事件委托使用详解
-
不知大家遇到过这种问题么,一个层宽度设为100%,并设置背景图片,在浏览器中浏览,缩小窗口到滚动条出现,然后拖动滚动条到右侧,右侧的区域变成空白,怎么解决?_html/css_WEB-ITnose
-
jquery中获得$.ajax()事件返回的值并添加事件的方法_jquery
-
C#中事件的定义和使用
-
推荐分享Node.js中18个值得了解的Web框架和工具
-
使用css中的page-break-after属性来实现WEB页面强制分页打印
-
div2 在 div3中, 希望div2的高度填满div3_html/css_WEB-ITnose