1、概述

1.1 在何处添加事件监听器

您需要以一种可以在事件发生之前触发的方法添加事件监听器。但是,为了获得最佳的加载性能,应尽可能晚添加事件监听器。

你可以在以下位置添加事件监听器:

1.1.1 组件的模板中

您可以在render函数内的模板中使用lit-html @event 绑定,将事件监听器添加到组件中。例如:

render() {
return html`<button @click="${this.handleClick}">`;
}

1.1.2 在组件构造方法中

如果您需要监听将组件添加到DOM之前可能发生的事件,则可能需要在组件的构造函数中添加事件监听器。例如:

constructor() {
super();
this.addEventListener('DOMContentLoaded', this.handleLoaded);
}

1.1.3 在firstUpdated中

firstUpdated是一个LitElement生命周期回调。首次更新和渲染组件后,会触发firstUpdated。

如果您要处理的事件在第一次更新和呈现组件之前无法发生,那么在firstUpdated中为其添加监听器是安全有效的。

firstUpdated(changedProperties) {
this.addEventListener('click', this.handleClick);
}

1.1.4 在connectedCallback中

connectedCallback是自定义元素API中的生命周期回调。

每当将自定义元素附加到文档连接的元素中时,connectedCallback都会触发。

如果您的组件将事件监听器添加到其自身或其子级以外的任何事物(例如,添加到Window,Document或主DOM中的某个元素),则应在connectedCallback中添加监听器,并在disconnectedCallback中将其删除。

  • 删除disconnectedCallback中的事件监听器可确保在销毁组件或将其与页面断开连接时,将清除由组件分配的所有内存。
  • 在connectedCallback(而不是例如构造函数或firstRendered)中添加事件侦听器可确保您的组件在断开连接并随后重新连接至DOM时将重新创建其事件侦听器。

例如:

connectedCallback() {
super.connectedCallback();
document.addEventListener('readystatechange', this.handleChange);
}
disconnectedCallback() {
document.removeEventListener('readystatechange', this.handleChange);
super.disconnectedCallback();
}

1.2 在事件处理函数中使用this

就像其他语言中的this一样,基于LitElement的组件的事件处理程序中的默认JavaScript上下文对象(this)是组件本身。

用法也是一样,您可以使用它来引用任何事件处理程序内的元素实例:

class MyElement extends LitElement {
render() {
return html`<button @click="${this.handleClick}">click</button>`;
}
handleClick(e) {
console.log(this.prop);
}
}

关于JavaScript的this指针详见MDN文档

1.3 从基于LitElement的组件触发事件

1.3.1 触发一个自定义事件

class MyElement extends LitElement {
render() {
return html`<div>Hello World</div>`;
}
firstUpdated(changedProperties) {
let event = new CustomEvent('my-event', {
detail: {
message: 'Something important happened'
}
});
this.dispatchEvent(event);
}
}

1.3.2 触发一个标准事件

class MyElement extends LitElement {
render() {
return html`<div>Hello World</div>`;
}
updated(changedProperties) {
let click = new Event('click');
this.dispatchEvent(click);
}
}

1.4 处理由基于LitElement的组件触发的事件

如果要从另一个LitElement或lit-html模板中监听从基于LitElement的组件触发的事件,则可以使用lit-html声明性事件语法:

<my-element @my-event="${(e) => { console.log(e.detail.message) }}"></my-element>

要在其他上下文(例如HTML或其他框架)中监听从基于LitElement的组件触发的事件,请使用标准机制监听DOM事件。

在纯HTML和JavaScript中,这将是addEventListener API:

const myElement = document.querySelector('my-element');
myElement.addEventListener('my-event', (e) => {console.log(e)});

2、处理事件和影子DOM

使用事件和影子DOM时,需要了解一些事项。

2.1 事件冒泡

一些事件在DOM树中冒泡,因此页面上的任何元素都可以检测到它们。

事件是否冒泡取决于bubbles属性。要检查特定事件是否冒泡:

handleEvent(e){
console.log(e.bubbles);
}

有关更多信息,请参见MDN上的事件接口文档。

2.2 事件重定向

从影子DOM内部触发的冒泡事件被重定向,所以对组件外部的任何监听器而言,它们似乎都来自组件本身。

example:

<my-element onClick="(e) => console.log(e.target)"></my-element>
render() {
return html`
<button id="mybutton" @click="${(e) => console.log(e.target)}">
click me
</button>`;
}

处理此类事件时,您可以使用compoundPath查找其起源:

handleMyEvent(event) {
console.log('Origin: ', event.composedPath()[0]);
}

2.3 自定义事件

默认情况下,在影子DOM内部触发的冒泡自定义事件在到达影子root时将停止冒泡。

要使自定义事件通过阴影DOM边界传递,必须将composite和bubble标志都设置为true:

firstUpdated(changedProperties) {
let myEvent = new CustomEvent('my-event', {
detail: { message: 'my-event happened.' },
bubbles: true,
composed: true });
this.dispatchEvent(myEvent);
}

有关更多信息,请参见有关自定义事件的MDN文档

LitElement(五)事件的更多相关文章

  1. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  2. CLR via C#深解笔记五 - 事件

    事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e);   类型 ...

  3. salesforce lightning零基础学习(五) 事件阶段(component events phase)

    上一篇介绍了lightning component events的简单介绍.此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Phase). 一. 阶段(Phase)的概念 ...

  4. stenciljs 学习五 事件

    组件可以使用Event Emitter装饰器发送数据和事件. Event 定义 参考: import { Event, EventEmitter } from '@stencil/core'; ... ...

  5. 07_jQuery对象初识(五)事件(非常重要)

    1. 目前为止学过的绑定事件的方式 1. 在标签里面写 onclick=foo(this); 2. 原生DOM的JS绑定 DOM对象.onclick=function(){...} 3. jQuery ...

  6. SQL Server 事件通知(Event notifications)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...

  7. C#编程之委托与事件四(二)【转】

    C#编程之委托与事件(二)       我在上一篇文章(C#编程之委托与事件(一) )中通过示例结合的方法介绍了委托,在本文中,我同样以代码示例的方式来介绍C#里的事件机制. 二.事件   1.了解概 ...

  8. 浅谈JavaScript之事件(上)

    一  简述JavaScript及其在浏览器中的地位 (一)  浏览器主要构成 虽然不同浏览器之间存在差异(如Google Chrome,Firefox,Safari和IE等),但单从浏览器构成来说,大 ...

  9. javascript中的事件问题的总结

    一.什么是事件? 事件就是DOM和浏览器之间的交互行为(只要触发了这个行为,也就相当于触发了事件),我们可以通过事件监听来绑定事件,例如:box.onclick=function(){},如果我们点击 ...

随机推荐

  1. 【sklearn】Toy datasets上的分类/回归问题 (XGBoost实践)

    分类问题 1. 手写数字识别问题 from sklearn.datasets import load_digits digits = load_digits() # 加载手写字符识别数据集 X = d ...

  2. 题解【洛谷P2730】魔板 Magic Squares

    题面 首先我们可以发现,在每一次 BFS 时按照 \(A→B→C\) 的顺序枚举遍历肯定是字典序最小的. 然后就是普通的 BFS 了. 我们考虑使用 \(\text{STL map}\) 来存储起点状 ...

  3. Spark学习之路 (二十七)图简介[转]

    test test test test test test test test test 图 基本概念 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种数据结构. 这里的图并非 ...

  4. P5163 WD与地图 [整体二分,强连通分量,线段树合并]

    首先不用说,倒着操作.整体二分来做强连通分量,然后线段树合并,这题就做完了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h ...

  5. PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)

    本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumber ( const int N ); 其中 ...

  6. 问题 I: 排名

    #include <cstdio> #include <cstring> #include <algorithm> #include <vector> ...

  7. 浅识mysql主键

    primary key:主键,又叫主键约束. primary key在表中是唯一代表一条记录的.primary key可以是1列,或者多列组合而成的. 如何查看一个表的主键是什么,举个例子: desc ...

  8. ASP.NET常用内置对象(一)Request

    用来获取客户端在请求一个页面或传送一个Form是提供的所有信息.它包括用户的HTTP变量.能够识别的浏览器信息.存储客户端的Cookie信息和请求地址等. Request对象是System.Web.H ...

  9. Wannafly Winter Camp 2020 Day 5H Geometry PTSD - 构造,计算几何

    Solution 考虑如何计算点到平面的距离,我们可以用行列式算出锥形的体积和底面的面积,来得到距离 考虑构造一个等边三角形,这样基本是满足 \(\geq 1.7\) 的条件的 于是我们对它的坐标枚举 ...

  10. H5_0012:js事件冒泡和捕获

    捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...