详解JS事件 - 事件模型/事件流/事件代理/事件对象/自定义事件
栏目: JavaScript · 发布时间: 5年前
内容简介:元素进行事件监听的时候,它的回调函数里就会默认传递一个参数 event,它是一个对象只能在DOM元素上自定义事件
事件模型
-
DOM0 级事件模型-没有事件流,这种方式兼容所有浏览器
// 方式一 将事件直接通过属性绑定在元素上 <button onclick="clickBtn()"></button> / 方式二 获取到页面元素后,通过 onclick 等事件,将触发的方法指定为元素的事件 var btn = document.getElementById('btn') btn.onclick = function () {...} btn.onclick = null
-
IE 事件模型- 只有冒牌,仅在 IE 浏览器中有效,不兼容其他浏览器
- 事件处理阶段:事件在达到目标元素时,触发监听事件
- 事件冒泡阶段:事件从目标元素冒泡到 document,并且一次检查各个节点是否绑定了监听函数,如果有则执行
// 绑定事件 el.attachEvent(eventType, handler) // 移除事件 el.detachEvent(eventType, handler)
-
DOM2 级事件模型- W3C标准模型,除 IE6-8 以外的所有现代浏览器都支持该事件模型
- 事件捕获阶段:事件从 document 向下传播到目标元素,依次检查所有节点是否绑定了监听事件,如果有则执行 - 从外向内,把这个坐标转换为具体的元素上事件的过程,就是捕获过程(点击事件来自触摸屏或者鼠标,鼠标点击并没有位置信息,但是一般操作系统会根据位移的累积计算出来,跟触摸屏一样,提供坐标给浏览器)
- 事件处理阶段:事件在达到目标元素时,触发监听事件
- 事件冒泡阶段:事件从目标元素冒泡到 document,并且一次检查各个节点是否绑定了监听函数,如果有则执行 - 从内向外,是人类处理事件的逻辑
// 绑定事件 target.addEventListener(type, listener[, useCapture]); // 移除事件 target.addEventListener(type, listener[, useCapture]);
事件流:
- 浏览器事件流向捕获阶段、目标阶段、冒泡阶段,就是我们所说的- W3C事件模型
-
兼容的事件绑定写法
function bindEvent(obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, eventFn); } else { obj.attachEvent("on" + type, eventFn); } function eventFn(ev) { var ev = ev || window.event; var target = ev.target || ev.srcElement; fn && fn(target, ev) } }
事件代理
- 定义:指利用“事件冒泡”,只通过指定一个事件处理程序,来管理某一类型的所有事件
-
优点:
(1)可以大量节省内存占用,减少事件注册,比如在table上代理所有td的click事件就非常棒
(2)可以实现当新增子对象时无需再次对其绑定事件,对于动态内容部分尤为合适
- 缺点:仅限于上述需求下,如果把所有事件都用代理就可能会出现事件误判,即本不应用触发事件的被绑上了事件
- demo: 把动态列表的点击事件,绑定在父元素上
事件对象Event
元素进行事件监听的时候,它的回调函数里就会默认传递一个参数 event,它是一个对象
-
属性:
- event.target:指的是触发事件的那个节点,也就是事件最初发生的节点(fn触发的元素)
- event.currentTarget:指的是正在执行的监听函数的那个节点(fn绑定的元素)
- event.isTrusted:表示事件是否是真实用户触发。
- event.preventDefault():取消事件的默认行为。
- event.stopPropagation():阻止事件的派发(包括了捕获和冒泡)
- event.stopImmediatePropagation():阻止同一个事件的其他监听函数被调用。
- target和currentTarget区别:触发事件的元素和事件绑定的元素
-
stopPropagation和stopImmediatePropagation区别:
- stopPropagation只对书写的那个事件有用,再绑定另一个click失效
- stopImmediatePropagation对绑定的很多类型的事件都有用
- 兼容写法: ev.target || ev.srcElement
addEventListener(W3C)
-
参数:
- 事件名称 event
- 事件处理函数/具有 handleEvent函数的对象 listener
-
第三个参数
- once:只执行一次
- passive:承诺此事件监听不会调用 preventDefault,这有助于性能
- useCapture:是否捕获true(否则冒泡false)
- 移除:removeEventListener(事件名称、事件回调、捕获/冒泡)
自定义事件:
只能在DOM元素上自定义事件
//使用 Event 构造器来创造了一个新的事件 var evt = new Event("look", {"bubbles":true, "cancelable":false}); document.dispatchEvent(evt);
面试题
- 了解js的事件吗?
- 说说js的事件/绑定事件的方法?/了解事件流吗?
- 事件流的顺序是什么?
补充
- React组件中怎么做事件代理
- React组件事件代理的原理
- React的事件合成机制好像和js的不太一样 (绑定一个事件到一个组件上)
- Emit事件怎么发,需要引入什么
- 页面上生成一万个button,并且绑定事件,如何做(JS原生操作DOM)
- 添加原生事件不移除为什么会内存泄露
- vue 中的 native 修饰符
- 移动端点击穿透:fastclick
- 手写原生js实现事件代理,并要求兼容浏览器
- 事件如何派发也就是事件广播(dispatchEvent
- 总结: https://www.cnblogs.com/dfyg-...
- 手写一个冒泡 排序 处理事务
以上所述就是小编给大家介绍的《详解JS事件 - 事件模型/事件流/事件代理/事件对象/自定义事件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JS事件详解
- Oracle等待事件内容详解
- nginx事件模块结构体详解
- 【WEB系列】SSE服务器发送事件详解
- SpringBoot内置生命周期事件详解 SpringBoot源码(十)
- NodeJS中的事件(EventEmitter) API详解(附源码)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java并发编程实战
Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea / 童云兰 / 机械工业出版社华章公司 / 2012-2 / 69.00元
本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性......一起来看看 《Java并发编程实战》 这本书的介绍吧!