js【详解】事件

简介: js【详解】事件

给 DOM 节点绑定事件

推荐使用 addEventListener 函数

  • 第一个参数:事件名称
  • 第二个参数:事件处理函数(第一个参数为 event)
  • 第三个参数:
  • true 采用捕获法来处理事件
  • false 【推荐】采用冒泡法来处理事件
let div1= document.getElementById('div1');
div1.addEventListener('click', function(event){
  alert('div1_clicked!');
}, false);

event 参数的用途

  • event.target 获取触发事件的元素
  • event.preventDefault() 阻止默认行为
    默认行为如:a标签点击跳转、鼠标右键弹出菜单、滑动滚轮控制滚动条等
  • event.stopPropagation() 阻止事件传播(冒泡/捕获)

事件流(含事件冒泡,事件捕获)

https://blog.csdn.net/weixin_41192489/article/details/133140101

【必考】事件代理

借助其他元素来响应自身事件即事件代理。

应用范例:对于内容很多的列表,为了避免给每一个列表中的元素都绑定一个点击事件,仅在列表的容器元素上绑定点击事件,则当点击列表中的元素时,因事件冒泡机制,会触发容器元素的点击事件,再在该事件中,识别出点击的具体元素,并执行相应的处理。

// 列表内容很多的容器
const div3 = document.getElementById("div3");

// 点击列表中a标签的元素时,弹窗显示其内容
div3.addEventListener("click", (event) => {
  event.preventDefault();
  let target = event.target;
  if (target.nodeName === "A") {
    alert(target.innerHTML);
  }
});

【考题】写一个通用的事件绑定函数

/**
 * 通用的事件绑定函数(支持事件代理)
 * @param {*} elem      触发事件的元素
 * @param {*} type      事件类型
 * @param {*} selector  选择器
 * @param {*} fn        事件处理函数
 */
function bindEvent(elem, type, selector, fn) {
  //若只传入了三个参数(即普通的事件绑定),则第三个参数才是事件处理函数
  if (fn == null) {
    // 将第三个参数设置为事件处理函数
    fn = selector;
    // 将选择器置空
    selector = null;
  }
  // 绑定事件
  elem.addEventListener(type, (event) => {
    // 获取触发事件的元素
    const target = event.target;
    if (selector) {
      // 传入了选择器,则为事件代理绑定
      if (target.matches(selector)) {
        // 若触发事件的元素与选择器匹配,则执行事件处理函数
        fn.call(target, event); // 利用 call 改变事件处理函数中 this 的指向
      }
    } else {
      // 没有选择器,为普通事件绑定
      fn.call(target, event);
    }
  });
}

使用

// 普通事件绑定
const btn1 = document.getElementById('btn1')
bindEvent(btn1, 'click', function (event) {
    event.preventDefault()
    alert(this.innerHTML)
})

// 事件代理绑定
const div3 = document.getElementById('div3')
bindEvent(div3, 'click', 'a', function (event) {
    event.preventDefault()
    alert(this.innerHTML)
})


【考题】描述事件冒泡的流程

事件基于 DOM 树形结构顺着触发元素不断向上传播(由内层节点传播到外层节点),触发各级父辈节点对应的事件,若父辈节点中没有阻断事件的冒泡传播,则会一直传播到window 对象。

应用场景:事件代理(参考上文)

【考题】无限下拉图片列表,如何监听每个图片的点击

通过事件代理实现,具体逻辑如下:

  • 在列表容器上绑定点击事件
  • 点击图片时,会冒泡触发列表容器的点击事件
  • 通过 e.target 获取到触发元素
  • 通过 matches 判断触发元素是否是图片
  • 是图片,则执行相应的代码,不是图片则不执行。
目录
相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
javascript onkeydown事件
javascript onkeydown事件
|
5月前
|
JavaScript 前端开发
js事件队列
js事件队列
149 55
|
3月前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
52 3
|
2天前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
18 3
|
4月前
|
JavaScript 前端开发
JavaScript 事件
JavaScript 事件
44 2
|
5月前
|
JavaScript 前端开发
JavaScript 事件的绑定
JavaScript 事件的绑定
54 0
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
74 5
|
3月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
71 6
|
4月前
|
JavaScript 前端开发
JavaScript HTML DOM 事件
JavaScript HTML DOM 事件
33 5
|
4月前
|
监控 JavaScript 前端开发

热门文章

最新文章