资讯专栏INFORMATION COLUMN

详解JS事件 - 事件模型/事件流/事件代理/事件对象/自定义事件

URLOS / 3498人阅读

摘要:取消事件的默认行为。阻止事件的派发包括了捕获和冒泡阻止同一个事件的其他监听函数被调用。

事件模型

DOM0 级事件模型 -没有事件流,这种方式兼容所有浏览器

// 方式一  将事件直接通过属性绑定在元素上

/ 方式二 获取到页面元素后,通过 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-...

手写一个冒泡排序处理事务

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103828.html

相关文章

  • 前端面试(知识点)整理(一)

    摘要:接受个参数事件类型,是否冒泡,是否阻止浏览器的默认行为触发上绑定的自定义事件触发元素上绑定事件事件的委托代理的原理以及优缺点。委托代理事件是那些被绑定到父级元素的事件,但是只有当满足一定匹配条件时才会被挪。 一、页面布局 1.问题:假设高度已知,请写出三栏布局 ,其中左栏、右栏宽度各为300px,中间自适应。 解决方案一:使用浮动布局` Document ...

    zhichangterry 评论0 收藏0
  • 前端面试(知识点)整理(一)

    摘要:接受个参数事件类型,是否冒泡,是否阻止浏览器的默认行为触发上绑定的自定义事件触发元素上绑定事件事件的委托代理的原理以及优缺点。委托代理事件是那些被绑定到父级元素的事件,但是只有当满足一定匹配条件时才会被挪。 一、页面布局 1.问题:假设高度已知,请写出三栏布局 ,其中左栏、右栏宽度各为300px,中间自适应。 解决方案一:使用浮动布局` Document ...

    Songlcy 评论0 收藏0
  • 前端面试(知识点)整理(一)

    摘要:接受个参数事件类型,是否冒泡,是否阻止浏览器的默认行为触发上绑定的自定义事件触发元素上绑定事件事件的委托代理的原理以及优缺点。委托代理事件是那些被绑定到父级元素的事件,但是只有当满足一定匹配条件时才会被挪。 一、页面布局 1.问题:假设高度已知,请写出三栏布局 ,其中左栏、右栏宽度各为300px,中间自适应。 解决方案一:使用浮动布局` Document ...

    ThreeWords 评论0 收藏0
  • js 事件笔记

    摘要:只能写成在捕获阶段监听这个事件。默认为,表示事件是否可以被取消只有为的时候,才能用取消这个事件。阻止默认事件结果结果和在事件处理程序内部,始终等同于,为绑定事件的元素,而是为触发事件的实际目标。 一、事件简述 1、事件概念 在Web中, 事件在浏览器窗口中被触发,执行事先绑定的事件处理器(也就是事件触发时会运行的代码块),对事件做出响应。用户在浏览器的任何一个操作都会去触发一个事件,J...

    Barry_Ng 评论0 收藏0
  • DOM事件机制

    摘要:而事件分为个级别级事件处理,级事件处理和级事件处理。一个事件发生后,会在子元素和父元素之间传播。也就是说,始终是监听事件者,而是事件的真正发出者。五参考文章级别与事件事件机制解惑事件模型事件委托详解事件的学与记和和的区别 前言 本文主要介绍DOM事件级别、DOM事件模型、事件流、事件代理和Event对象常见的应用,希望对你们有些帮助和启发! 本文首发地址为GitHub博客,写文章不易,...

    laznrbfe 评论0 收藏0

发表评论

0条评论

URLOS

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<