常用的click事件居然这么多门道,赶紧卷

简介: 你真的了解 onclick 点击事件吗? onclick 是异步的还是同步的?事件的触发顺序你了解过吗?现在我就带你一起来了解一下 onclick 事件前后左右的一些事情。

你真的了解onclick点击事件吗?onclick是异步的还是同步的?事件的触发顺序你了解过吗?现在我就带你一起来了解一下onclick事件前后左右的一些事情。

onclick简介

onclickHTML中的一个事件属性,它的作用是当用户点击元素时触发的事件。

onclick事件可以绑定在任何元素上,比如<div><button><a>等等。

onclick事件的触发顺序是先捕获后冒泡,也就是说先触发捕获事件,然后触发冒泡事件。

onclick的异步性

onclick事件是异步的,也就是说onclick事件的触发是在JavaScript的执行栈中的任务执行完毕之后才会触发。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>onclick</title>
</head>
<body>
<button id="btn">click</button>
<script>
    document.getElementById('btn').onclick = function () {
    
        console.log('click');
    }

    console.log('start');
    for (var i = 0; i < 1000000000; i++) ;
    console.log('end');
</script>
</body>
</html>

上面的代码中,我们在<button>元素上绑定了onclick事件,然后在JavaScript中使用了一个for
循环,这个循环会执行一亿次,这个时候页面会卡住,但是不妨碍你点击按钮。

这个时候你点击按钮,控制台是不会有任何响应的,这是因为onclick事件是异步的,所以当你点击按钮的时候,onclick
事件并没有被触发,而是等到JavaScript的执行栈中的任务执行完毕之后才会触发。

onclick的同步性

上面说了onclick事件是异步的,现在又说onclick事件是同步的,这样说的话好像有点矛盾,其实这两种说法都是正确的,直接上代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>onclick</title>
</head>
<body>
<button id="btn">click</button>
<script>
    document.getElementById('btn').onclick = function () {
    
        console.log('click');
    }

    for (var i = 0; i < 10; i++) {
    
        console.log(i);
        if (i === 5) {
    
            document.getElementById('btn').click();
        }
    }
</script>
</body>
</html>

上面的代码中,控制台输出到5的时候,我们手动触发了onclick事件,这个时候控制台会输出click
,然后继续输出后面的,这个就说明了onclick同步性。

查阅了相关资料,如果onclick事件是由用户手动触发的,那么onclick事件是异步的,会压入事件队列中,如果onclick
事件是由JavaScript代码触发的,那么onclick事件是同步的,会立即执行。

onclick的触发顺序

onclick事件的触发顺序是先捕获后冒泡,也就是说先触发捕获事件,然后触发冒泡事件。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>onclick</title>
</head>
<body>
<div id="div1">
    <div id="div2">
        <div id="div3">
            <button id="btn">click</button>
        </div>
    </div>
</div>
<script>
    document.getElementById('div1').onclick = function () {
    
        console.log('div1');
    }

    document.getElementById('div2').onclick = function () {
    
        console.log('div2');
    }

    document.getElementById('div3').onclick = function () {
    
        console.log('div3');
    }

    document.getElementById('btn').onclick = function () {
    
        console.log('btn');
    }
</script>
</body>
</html>

上面的代码中,我们在<div>元素和<button>元素上分别绑定了onclick事件,然后点击<button>元素,控制台会依次输出btn
div3div2div1,这就是onclick事件的触发顺序。

事件触发的先后顺序

onclick事件中,如果我们绑定了多个和鼠标按键相关的事件,那么这些事件的触发顺序是怎样的呢?

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>onclick</title>
</head>
<body>
<button id="btn">click</button>
<script>
    document.getElementById('btn').onclick = function () {
    
        console.log('click');
    }

    document.getElementById('btn').ondblclick = function () {
    
        console.log('dblclick');
    }

    document.getElementById('btn').onmousedown = function () {
    
        console.log('mousedown');
    }

    document.getElementById('btn').onmouseup = function () {
    
        console.log('mouseup');
    }
</script>
</body>
</html>

上面的代码中,我们在<button>元素上绑定了onclickondblclickonmousedownonmouseup四个事件。

然后点击<button>元素,控制台会依次输出mousedownmouseupclick

如果双击<button>元素,控制台会依次输出mousedownmouseupclickmousedownmouseupclickdblclick

所以事件触发的先后顺序是onmousedownonmouseuponclickondblclick

所以呢在使用onclick事件的时候,如果绑定了多个和鼠标按键相关的事件,那么就需要注意事件处理的逻辑,避免出现一些意想不到的问题。

事件对象

onclick事件中,我们可以通过event参数来获取事件对象,事件对象中包含了事件的相关信息。

事件对象eventMouseEvent的实例,它继承了UIEventEvent,所以事件对象中包含了UIEventEvent的所有属性和方法。

MouseEvent的属性:

属性 说明
altKey 是否按下了Alt
button 鼠标按键的编号
buttons 鼠标按键的状态
clientX 鼠标指针相对于浏览器窗口的水平坐标
clientY 鼠标指针相对于浏览器窗口的垂直坐标
ctrlKey 是否按下了Ctrl
metaKey 是否按下了Meta
movementX 鼠标指针在水平方向上的移动距离
movementY 鼠标指针在垂直方向上的移动距离
offsetX 鼠标指针相对于事件目标的水平坐标
offsetY 鼠标指针相对于事件目标的垂直坐标
pageX 鼠标指针相对于文档的水平坐标
pageY 鼠标指针相对于文档的垂直坐标
relatedTarget 鼠标指针相关的元素
screenX 鼠标指针相对于屏幕的水平坐标
screenY 鼠标指针相对于屏幕的垂直坐标
shiftKey 是否按下了Shift

MouseEvent的方法:

  • getModifierState(): 返回一个布尔值,表示是否按下了指定的键。
  • initMouseEvent(): 初始化事件对象。
  • preventDefault(): 阻止事件的默认行为。
  • stopImmediatePropagation(): 阻止事件向上冒泡,并阻止事件的进一步捕获或冒泡。
  • stopPropagation(): 阻止事件向上冒泡。

click事件注册的方式

click事件可以通过onclick属性、addEventListener()方法和attachEvent()方法注册。

onclick属性

onclick属性是Element的一个属性,它的值是一个函数,当click事件触发时,会执行这个函数。

<button onclick="console.log('click')">click</button>

addEventListener()

addEventListener()方法是EventTarget的一个方法,它的第一个参数是事件的名称,第二个参数是事件处理函数,第三个参数是一个布尔值,表示是否在捕获阶段触发事件处理函数。

<button id="btn">click</button>
<script>
  var btn = document.getElementById('btn');
  btn.addEventListener('click', function() {
    
    console.log('click');
  });
</script>

attachEvent()

attachEvent()方法是EventTarget的一个方法,它的第一个参数是事件的名称,第二个参数是事件处理函数。

<button id="btn">click</button>
<script>
  var btn = document.getElementById('btn');
  btn.attachEvent('onclick', function() {
    
    console.log('click');
  });
</script>

结语

click事件是鼠标点击事件,它是MouseEvent的一个实例,它的事件类型是click,它可以通过onclick属性、addEventListener()方法和attachEvent()方法注册。

参考链接

MDN click

MDN MouseEvent

目录
相关文章
|
机器学习/深度学习 人工智能 安全
论文介绍:从黑盒生产语言模型中提取信息的模型窃取攻击
【2月更文挑战第22天】论文介绍:从黑盒生产语言模型中提取信息的模型窃取攻击
385 6
论文介绍:从黑盒生产语言模型中提取信息的模型窃取攻击
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
513 1
|
JavaScript 前端开发
|
9月前
|
SQL 算法 搜索推荐
mysql 之order by工作流程
本文深入解析了MySQL中`ORDER BY`的排序机制,通过具体示例展示了排序过程及性能优化方法。文章首先分析了基于内存和磁盘的排序方式,包括`sort_buffer_size`的影响以及临时文件的使用场景。接着介绍了`rowid`排序算法,该算法通过减少参与排序的数据量来提升性能,并对比了其与传统排序的区别。此外,还探讨了随机查询`ORDER BY RAND()`的执行流程及其优化策略。最后提到了MySQL 5.6引入的优先队列排序算法,适用于仅需部分有序结果的场景。文章结合`optimizer_trace`工具详细说明了各配置参数对排序行为的影响,为优化查询提供了实用指导。
140 1
mysql 之order by工作流程
|
机器学习/深度学习 安全 算法
应用级网关防火墙
【8月更文挑战第17天】
521 4
|
机器学习/深度学习 PyTorch API
生成对抗网络(GAN)由两部分组成:生成器(Generator)和判别器(Discriminator)。
生成对抗网络(GAN)由两部分组成:生成器(Generator)和判别器(Discriminator)。
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。
|
存储 Linux Apache
释放磁盘空间:解决文件删除但空间未释放的困扰
在管理Linux系统的日常中,最令人头疼的时刻之一就是发现尽管已删除了巨大的文件,但是磁盘空间的占用率仍然没有任何下降。这种情况不仅让我怀疑自己的操作是否正确,同时也给操作系统的运行带来了隐患。 究竟问题出在哪,又该如何解决?本次记录,将演示释放磁盘空间:解决文件删除但空间未释放的困扰。
释放磁盘空间:解决文件删除但空间未释放的困扰
|
SQL Java 数据库连接
MyBatis-Plus更新使用null值
MyBatis-Plus更新使用null值
566 2
|
机器学习/深度学习 数据采集 算法
基于Apriori关联规则的电影推荐系统(附python代码)
这是一个基于Apriori算法的电影推荐系统概览。系统通过挖掘用户评分数据来发现关联规则,例如用户观看某部电影后可能感兴趣的其他电影。算法核心是逐层生成频繁项集并设定最小支持度阈值,之后计算规则的置信度。案例中展示了数据预处理、频繁项集生成以及规则提取的过程,具体包括用户评分电影的统计分析,如1-5部电影的评分组合。最后,通过Python代码展示了Apriori算法的实现,生成推荐规则,并给出了一个简单的推荐示例。整个过程旨在提高推荐的精准度,基于用户已评分的电影推测他们可能尚未评分但可能喜欢的电影。
基于Apriori关联规则的电影推荐系统(附python代码)