事件委托&判断鼠标是否点击到元素外部区域

此文章讲解的是事件委托的基本概念和原理实现;以及拓展到的常见场景问题“判断鼠标是否点击到元素外部区域”。

一. 事件委托

1. 概念

事件流:事件捕获阶段(外至内)–>处于目标阶段(事件响应到触发事件的最底层元素上)–>事件冒泡阶段(内至外,默认false冒泡)
事件委托:将一个元素的绑定事件委托到另一个 元素上
优点:减少内存的消耗、动态绑定事件

2. 场景问题

一个ul下有十个li,需要每次点击li标签的时候,打印出被点击的li的innerHTML文本内容,如何做?

3. 代码实现

人们最常见的惯性思维:取到ul下的所有li标签元素数组集合,遍历元素添加监听事件。这种思路可以实现,但是冗余,性能差。如果有1000个li呢?下面借用事件委托的原理实现:

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
...
var ul = document.getElementsByTagName("ul")[0];
ul.addEventListener("click", function(e) {
    var event = e || window.event;
    var target = event.target || event.srcElement;
    if(target.nodeName.toLowerCase() == "li") {
        console.log(target.innerHTML);
    }
}) 

解析:事件流中添加监听事件的方式默认是false冒泡的,触发函数的执行是由内至外的,所以当我们点击每一个li的时候,会向上冒泡至ul元素,遂可。

二. 判断鼠标是否点击到元素外部区域

1. 场景问题

在一个div里面有个input,判断鼠标是否点击到input外部区域

2. 代码实现

<div id="app_out_in">
    姓名<input id="name" type="text" aria-label="姓名">
</div>
...
document.getElementById("app_out_in").addEventListener("click", function(e) {
    var event = e || window.event;
    var target = event.target || event.srcElement;
    // if(target.id == "name") {
    if(document.getElementById("name").contains(target)) {
        console.log("in");
    } else {
        console.log("out");
    }
}) 

解析:在父元素div上添加监听事件,获取当前点击的目标target后,有两种判断方式1)判断点击的target的id是否为input框的id;2)判断点击的target是否被input框区域所包围。

忙碌于伪学习和满足项目的需求,很多时候都忘记了最基础的知识点,这是学习道路上的欲速不达!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值