「JS篇」自定义事件 – Event 和 CustomEvent

「关注前端infoQ加星标不迷路」

在react事件机制中,最后就是通过创建 fakeNode 来触发自定义事件,进而来进行调度工作的。

本文将演示如何创建和派发 DOM 事件,这些事件通常称为合成事件,而不是浏览器本身触发的事件。

创建自定义事件 – Event()

使用 Event 构造函数创建如下:

//创建事件
var event = new Event('build');

// 监听事件
elem.addEventListener('build', function (e) { ... }, false);

// 触发/派发事件
elem.dispatchEvent(event);

绝大多数现代浏览器中都会支持这个构造函数(IE例外)。要了解更为复杂的方法,可参考下面的早期方法 document.createEvent。

添加自定义数据 – CustomEvent()

要向事件对象添加更多数据,可以使用 CustomEvent,detail 属性可用于传递自定义数据。

使用CustomEvent 可以创建如下:

//创建事件
var event = new CustomEvent('build', { 'detail': elem.dataset.time });


// 监听事件
elem.addEventListener('build', function (e) {
  console.log(e.detail);
}, false);


// 触发/派发事件
elem.dispatchEvent(event);

早期方法 – document.createEvent

早期创建事件的方法受 Java API的启发。下面展示了一个示例:

// 创建事件
var event = document.createEvent('Event');

// 初始化自定义事件build
event.initEvent('build', true, true);

// 监听事件
document.addEventListener('build', function (e) {
  // do something
}, false);

// 触发对象可以是任何元素或其他事件目标
document.dispatchEvent(event);

事件冒泡

通常需要从子元素触发事件,并让祖先捕获它:

HTML
<form>
  <textarea></textarea>
</form>
JS
const form = document.querySelector('form');
const textarea = document.querySelector('textarea');


// 创建一个自定义事件,允许冒泡,可以通过 detail 属性去传递数据
const eventAwesome = new CustomEvent('awesome', {
  bubbles: true,
  detail: { text: () => textarea.value }
});


form.addEventListener('awesome', e => console.log(e.detail.text()));



//textarea 元素监听input事件,当文本域的内容发生变化时去触发自定义事件并且会向上冒泡
textarea.addEventListener('input', e => e.target.dispatchEvent(eventAwesome));

动态创建和派发事件

元素可以监听尚未创建的事件:

HTML
<form>
  <textarea></textarea>
</form>

JS
const form = document.querySelector('form');
const textarea = document.querySelector('textarea');

form.addEventListener('awesome', e => console.log(e.detail.text()));

textarea.addEventListener('input', function() {

  //文本的内容发生改变时,会动态创建自定义事件并进行派发
  this.dispatchEvent(new CustomEvent('awesome', { bubbles: true, detail: { text: () => textarea.value } }))
});

原文发布于微信公众号 - 前端infoQ(webinfoq)

原文发表时间:2019-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券