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 判断触发元素是否是图片
  • 是图片,则执行相应的代码,不是图片则不执行。
目录
相关文章
|
23天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指那些不会立即执行完毕,而是会在未来的某个时间点(比如某个操作完成后,或者某个事件触发后)才完成其执行的函数
【6月更文挑战第15天】JavaScript中的异步函数用于处理非同步任务,如网络请求或定时操作。它们使用回调、Promise或async/await。
25 7
|
11天前
|
JavaScript 前端开发
事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。
【6月更文挑战第27天】事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。例如,动态列表可共享一个`click`事件处理器,通过`event.target`识别触发事件的子元素,简化管理和响应动态内容变化。
15 0
|
21天前
|
数据采集 JavaScript 前端开发
理解并应用:JavaScript响应式编程与事件驱动编程的差异
了解JavaScript的响应式编程与事件驱动编程至关重要。事件驱动编程基于事件触发函数执行,如用户交互或系统事件。响应式编程则关注数据流变化,利用Observables自动响应更新。在爬虫代理IP的Web Scraping示例中,两者分别通过axios和rxjs显示了数据抓取的不同处理方式。掌握这两者能提升异步操作的效率和代码质量。
理解并应用:JavaScript响应式编程与事件驱动编程的差异
|
4天前
|
JavaScript
js 事件流、事件冒泡、事件捕获、阻止事件的传播
js 事件流、事件冒泡、事件捕获、阻止事件的传播
8 1
|
6天前
|
JavaScript
vue 全局响应键盘按键/监听键盘事件(含 js 获取键盘keyCode值的方法)
vue 全局响应键盘按键/监听键盘事件(含 js 获取键盘keyCode值的方法)
13 2
|
12天前
|
JavaScript 前端开发
JavaScript 中的三种事件模型
JavaScript 中的事件模型主要有三种: 传统事件模型(DOM Level 0) 标准事件模型(DOM Level 2) IE 事件模型(非标准,仅限于旧版本的 Internet Explorer)
13 1
|
19天前
|
JavaScript
Vue.js中使用.self修饰符来限制事件处理程序的作用域
Vue.js中使用.self修饰符来限制事件处理程序的作用域
|
17天前
|
JavaScript 前端开发
第八篇-Javascript 事件
第八篇-Javascript 事件
21 1
|
18天前
|
JavaScript 前端开发
杨老师课堂之JavaScript悬浮事件(鼠标移入移出事件)
杨老师课堂之JavaScript悬浮事件(鼠标移入移出事件)
19 1
|
24天前
|
JavaScript 前端开发
JS的监听事件
JS的监听事件