LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【WEB开发】JavaScript DOM事件系统

admin
2025年7月17日 0:9 本文热度 77

一、什么是DOM事件?

简单来说, DOM事件就是发生在HTML元素上的"事情". 比如用户点击了一个按钮(click事件), 鼠标移动到了某个元素上(mouseover事件),或者表单被提交了(submit事件)等等.

事件系统让我们能够"监听"这些事件,并在它们发生时执行相应的JavaScript代码,从而实现网页的交互功能.

事件的捕获与冒泡:

这个知识点很重要但容易被忽略! 当一个事件发生时,它会在DOM树中经历三个阶段:

  1. 捕获阶段: 从window对象一路向下,直到找到目标元素

  2. 目标阶段: 到达实际触发事件的元素

  3. 冒泡阶段: 从目标元素向上冒泡回window对象

示例代码:

<div id="outer">  <button id="inner">点我</button></div>
<script>  const outer = document.getElementById('outer');  const inner = document.getElementById('inner');
  //捕获阶段触发,第三个参数为true  outer.addEventListener('click'() => {    console.log('捕获阶段-outer');  }, true);
  // 冒泡阶段触发(默认)  outer.addEventListener('click'() => {    console.log('冒泡阶段-outer');  });
  inner.addEventListener('click'() => {    console.log('目标阶段-inner');  });</script>
二、事件处理程序
1)HTML属性写法, 这个不推荐.
<button onclick="alert('你好!')">点击我</button>

缺点:

  • HTML和JavaScript代码混在一起.

  • 不方便维护.

  • 只能添加一个处理函数.

2)DOM属性写法:

const btn = document.querySelector('button');btn.onclick = function() {  console.log('第一次点击');};
//这样会覆盖之前的处理函数btn.onclick = function() {  console.log('第二次点击');};

缺点:

  • 同样只能绑定一个处理函数.

  • 容易被覆盖.

3)addEventListener写法(推荐)

const btn = document.querySelector('button');
function firstClick() {  console.log('第一次点击');}
function secondClick() {  console.log('第二次点击');}
btn.addEventListener('click', firstClick);btn.addEventListener('click', secondClick);
//移除特定的处理函数btn.removeEventListener('click', firstClick);

优点:

  • 可以添加多个处理函数.

  • 不会互相覆盖.

  • 可以指定在捕获还是冒泡阶段触发.

  • 可以使用removeEventListener移除特定处理函数.

三、事件对象

当事件发生时, 浏览器会创建一个事件对象(通常命名为event或e), 它包含了关于事件的所有信息.

常用属性和方法:

element.addEventListener('click'function(e) {  //阻止默认行为(如表单提交、链接跳转)  e.preventDefault();
  //停止事件冒泡  e.stopPropagation();
  //停止事件捕获和冒泡,并阻止其他处理函数执行  e.stopImmediatePropagation();
  //事件目标(实际触发事件的元素)  console.log(e.target);
  //当前处理事件的元素(可能与target不同)  console.log(e.currentTarget);
  //事件类型  console.log(e.type);
  //鼠标位置  console.log(e.clientX, e.clientY);  //相对于视口  console.log(e.pageX, e.pageY);      //相对于文档
  //键盘事件相关  console.log(e.key);                 //按下的键  console.log(e.ctrlKey);             //是否按下了Ctrl键});

四、事件委托


事件委托是一种利用事件冒泡机制的技巧,它让我们不必为每个子元素单独添加事件监听,而是在父元素上设置一个监听器.

为什么用事件委托?

  1. 性能优化: 减少事件监听器数量

  2. 动态元素: 对新添加的子元素自动生效

  3. 内存节省: 减少内存占用

示例:

<ul id="todo-list">  <li>买牛奶</li>  <li>写代码</li>  <li>遛狗</li></ul>
<script>  const list = document.getElementById('todo-list');
  //传统写法,为每个li添加监听  // const items = list.querySelectorAll('li');  // items.forEach(item => {  //   item.addEventListener('click', function() {  //     console.log(this.textContent);  //   });  // });
  //事件委托写法  list.addEventListener('click'function(e) {    if (e.target.tagName === 'LI') {      console.log(e.target.textContent);    }  });
  //动态添加新项目  const newItem = document.createElement('li');  newItem.textContent = '学习事件委托';  list.appendChild(newItem);  //新添加的项目自动拥有点击事件</script>

五、自定义事件


除了浏览器内置的事件,我们还可以创建和触发自定义事件.

//创建事件const event = new Event('myCustomEvent');
// 监听事件document.addEventListener('myCustomEvent'function() {  console.log('自定义事件触发了');});
// 触发事件document.dispatchEvent(event);
//使用CustomEvent可以传递数据const event = new CustomEvent('build', {  detail: { timenew Date(), message'Hello World' }});
document.addEventListener('build'function(e) {  console.log('事件数据:', e.detail);});
document.dispatchEvent(event);

六、常见的事件类型

让我们看看一些常用的事件类型:

鼠标事件:

  • click-点击.

  • dblclick-双击.

  • mouseenter / mouseleave-鼠标进入/离开(不冒泡).

  • mouseover / mouseout-鼠标进入/离开(冒泡).

  • mousemove-鼠标移动.

  • contextmenu-右键菜单.

键盘事件:

  • keydown-键按下.

  • keyup-键释放.

  • keypress-键按下并产生字符(已废弃).


表单事件:

  • submit-表单提交.

  • change-值改变(如input、select).

  • input-输入时实时触发.

  • focus / blur-获取/失去焦点.

其他:

  • load / DOMContentLoaded-页面/DOM加载完成.

  • scroll-滚动.

  • resize-窗口大小改变.

七、其他使用技巧

防抖与节流:

  • 防抖(debounce):  连续触发时只执行最后一次.

  • 节流(throttle): 在一定时间间隔内只执行一次.

//防抖函数function debounce(func, delay) {  let timeout;  return function() {    clearTimeout(timeout);    timeout = setTimeout(() => func.apply(thisarguments), delay);  };}
//节流函数function throttle(func, limit) {  let inThrottle;  return function() {    if (!inThrottle) {      func.apply(thisarguments);      inThrottle = true;      setTimeout(() => inThrottle = false, limit);    }  };}
//使用示例window.addEventListener('resize'debounce(function() {  console.log('窗口大小改变了');}, 200));


阅读原文:原文链接


该文章在 2025/7/17 10:08:47 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved