当前位置: 首页 > news >正文

前端知识点 --- 事件监听器(javascript)

事件监听

✅ 事件监听的基本语法

element.addEventListener(event, function, useCapture);

element:目标元素。

event:事件类型,如 ‘click’、‘mouseover’、‘keydown’ 等。

function:事件发生时执行的回调函数。

useCapture (可选):true 表示在捕获阶段触发事件,false 表示在冒泡阶段触发事件(默认)。

🧑‍💻 示例 1:点击事件

<button id="myButton">点击我</button>

<script>
  let button = document.getElementById('myButton');
  button.addEventListener('click', function() {
    alert('你点击了按钮!');
  });
</script>

✅ 解释:

当你点击按钮时,事件监听器会捕捉到 ‘click’ 事件并执行弹窗。

🧑‍💻 示例 2:鼠标移入事件

<div id="box" style="width:200px;height:200px;background-color:lightblue;">
  移入我看看
</div>

<script>
  let box = document.getElementById('box');
  box.addEventListener('mouseover', function() {
    box.style.backgroundColor = 'lightcoral';
  });

  box.addEventListener('mouseout', function() {
    box.style.backgroundColor = 'lightblue';
  });
</script>

✅ 解释:

鼠标移入 mouseover 时,背景颜色变红。

鼠标移出 mouseout 时,背景颜色恢复。

✅ 事件冒泡和事件捕获
事件冒泡:事件从目标元素开始,逐层向父级元素冒泡传递。

事件捕获:事件从最顶层的父元素开始,逐层向目标元素传递。

document.body.addEventListener('click', function() {
  console.log('body被点击了');
}, true); // 使用事件捕获

document.getElementById('myButton').addEventListener('click', function() {
  console.log('按钮被点击了');
}, false); // 使用事件冒泡

✅ 解释:

如果 true,事件在捕获阶段执行。

如果 false,事件在冒泡阶段执行(默认)。

✅ 常见事件类型
鼠标事件:click、dblclick、mousedown、mouseup、mousemove

键盘事件:keydown、keyup、keypress

表单事件:submit、change、input、focus

窗口事件:resize、scroll、load、unload

e.preventDefault();

e.preventDefault(); 是 JavaScript 中阻止事件的默认行为的方法。它常用于表单、链接、按钮等事件处理中。

✅ 语法

element.addEventListener('event', function(e) {
  e.preventDefault();
});

e:事件对象,代表事件的详细信息。

preventDefault():阻止事件的默认行为。

✅ 实际应用场景

  1. 阻止链接跳转
document.querySelector('a').addEventListener('click', function(e) {
  e.preventDefault();
  console.log('链接被点击,但没有跳转');
});

场景: 链接点击后需要执行其他操作,而不是跳转到链接地址。

  1. 阻止表单提交
document.querySelector('form').addEventListener('submit', function(e) {
  e.preventDefault();
  console.log('表单提交已阻止');
});

场景: 在表单验证失败时阻止提交。

  1. 阻止右键菜单
document.addEventListener('contextmenu', function(e) {
  e.preventDefault();
  console.log('右键菜单已被阻止');
});

场景: 实现自定义右键菜单。

✅ 注意事项
preventDefault() 只阻止默认行为,不影响事件的传播。

如果要阻止事件冒泡,需要使用 e.stopPropagation()。

某些情况下,preventDefault() 无法生效,例如:

在 disabled 的按钮上点击。

在某些系统级别的浏览器操作中(如 F5 刷新)。

e.stopPropagation()

事件冒泡 是指当一个元素上的事件被触发时,事件会从目标元素向它的祖先元素逐级传播,直到到达 document 根节点的过程。

e.stopPropagation() 可以阻止事件向上冒泡,防止事件传播到父级元素。

✅ 事件冒泡的示意图
假设有以下 HTML 结构:

<div id="grandparent">
  <div id="parent">
    <button id="child">点击我</button>
  </div>
</div>

如果在每个元素上都绑定了 click 事件:

document.getElementById('grandparent').addEventListener('click', function() {
  console.log('祖父元素被点击');
});

document.getElementById('parent').addEventListener('click', function() {
  console.log('父元素被点击');
});

document.getElementById('child').addEventListener('click', function() {
  console.log('子元素被点击');
});
点击按钮后的结果:

子元素被点击
父元素被点击
祖父元素被点击
这就是事件冒泡的过程:事件从子元素向上层父级依次触发。

✅ 阻止事件冒泡
使用 e.stopPropagation() 可以阻止事件继续向上传播。

document.getElementById('child').addEventListener('click', function(e) {
  console.log('子元素被点击');
  e.stopPropagation(); // 阻止事件冒泡
});

点击按钮后的结果:

子元素被点击
父元素和祖父元素的事件不再触发。

✅ 应用场景

  1. 模态框中的事件阻止冒泡
    在弹窗中点击关闭按钮时,可能不希望点击事件冒泡到背景导致弹窗关闭:
document.getElementById('modal').addEventListener('click', function() {
  console.log('关闭弹窗');
});

document.getElementById('close-btn').addEventListener('click', function(e) {
  console.log('点击了关闭按钮');
  e.stopPropagation();
});

点击关闭按钮时只会输出 “点击了关闭按钮”,不会触发背景的关闭事件。

  1. 阻止导航栏中的事件冒泡
    在下拉菜单点击时,不希望触发外部 document 的点击事件:
document.getElementById('dropdown').addEventListener('click', function(e) {
  console.log('点击了下拉菜单');
  e.stopPropagation();
});

document.addEventListener('click', function() {
  console.log('关闭下拉菜单');
});
  • 点击菜单时不会关闭菜单,只有点击菜单外部时才会触发关闭逻辑。

相关文章:

  • Windows 常用快捷键
  • 数学概念学习
  • kube-vip实践
  • C# 正则表达式
  • WSL2增加memory问题
  • 开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o
  • 用 Python 也能做微服务?
  • 搭建小程序该如何选择服务器?
  • 恒流源电路深度解析:各类架构的优缺点与应用场景
  • C++14 新增的特性
  • 深入解析 Java GC 调优:减少 Minor GC 频率,优化系统吞吐
  • 数据结构篇:空间复杂度和时间复杂度
  • HarmonyOS NEXT开发实战——TypeScript快速入门与ArkTS介绍
  • go中的文件、目录的操作
  • 编程题记录3
  • 算法训练营第二十三天 | 贪心算法(一)
  • x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具
  • 《尘埃落定》读后感
  • Power BI嵌入应用:常见问题与调试技巧
  • endnote相关资料记录
  • 俄军方:已完成库尔斯克地区全面控制行动
  • 上海论坛2025年会聚焦创新的时代,9份复旦智库报告亮相
  • 体育公益之约跨越山海,雪域高原果洛孕育足球梦
  • 【社论】以“法治之盾”护航每一份创新
  • 商务部:汽车流通消费改革试点正在加快推进
  • A股三大股指涨跌互现,电力股走强,地产股冲高回落