js之事件代理/事件委托

事件代理也叫事件委托,原理:利用DOM元素的事件冒泡,指定一个事件的处理程序就可以管理某一类型的所有事件。
事件冒泡和事件捕获

如上图所示,事件传播分成三个阶段:
捕获阶段 :从window对象传导到目标节点(上层传到底层)称为"捕获阶段"(capture phase),捕获阶段不会响应任何事件;
目标阶段 :在目标节点上触发,称为"目标阶段"
冒泡阶段 :从目标节点传导回window对象(从底层传回上层),称为"冒泡阶段"(bubbling phase)。事件代理即是利用事件冒泡的机制把里层所需要响应的事件绑定到外层;

addEventListener 事件监听的三个参数

javascript 复制代码
element.addEventListener(event,function,useCapture)

useCapture第三个参数

  • 默认值为冒泡
  • true:代表捕获
  • false或者不填:代表冒泡

事件冒泡案例

javascript 复制代码
var body=document.getElementsByTagName('body')[0];
 
window.addEventListener('click',function(){
        console.log('window')
},false)
 body.addEventListener('click',function(){
        console.log('body')
},false)
 
var oDiv=document.getElementsByTagName('div')[0];
 oDiv.addEventListener('click',function(){
    console.log(1)
 },false)
 
oDiv.addEventListener('click',function(){
  console.log(2)
},false)

点击div运行结果  1 2 body window

事件捕获案例

javascript 复制代码
var body=document.getElementsByTagName('body')[0];
 
window.addEventListener('click',function(){
        console.log('window')
},true)
 body.addEventListener('click',function(){
        console.log('body')
},true)
 
var oDiv=document.getElementsByTagName('div')[0];
 oDiv.addEventListener('click',function(){
    console.log(1)
 },true)
 
oDiv.addEventListener('click',function(){
  console.log(2)
},true)

点击div运行结果  window body 1 2

经典面试题


使用事件委托的好处

使用事件代理的好处不仅在于将多个事件处理函数减为一个,而且对于不同的元素可以有不同的处理方法。假如上述列表元素当中添加了其他的元素节点(如:a、span等),我们不必再一次循环给每一个元素绑定事件,直接修改事件代理的事件处理函数即可。

阻止事件冒泡

  • 给子级加 event.stopPropagation( )
javascript 复制代码
$("#div1").mousedown(function(e){
    var e=event||window.event;
    event.stopPropagation();
});
  • 在事件处理函数中返回 false
javascript 复制代码
$("#div1").mousedown(function(event){
    var e=e||window.event;
    return false;
});

但是这两种方式是有区别的。return false 不仅阻止了事件往上冒泡,而且阻止了事件本身(默认事件)。event.stopPropagation()则只阻止事件往上冒泡,不阻止事件本身。

  • event.target==event.currentTarget,让触发事件的元素等于绑定事件的元素,也可以阻止事件冒泡;

阻止默认事件

  • event.preventDefault()

  • return false

相关推荐
子兮曰3 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen4 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05135 小时前
ctf show web 入门42
android·前端·android studio
kyriewen5 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u5 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby5 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6736 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇6 小时前
前端转后端:SQL 是什么
前端
张元清7 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技7 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端