javascript - litelement - 处理点击离开事件
问题描述
我正在使用 litelement 构建网站导航。它将有一个下拉菜单。我试图弄清楚如何添加一个事件,以便如果用户点击下拉菜单本身之外的任何地方,甚至是自定义元素之外的任何地方,下拉菜单都会关闭。我认为这是自然的期望。
我想向我的自定义元素添加一个可以用作“状态”的属性。connectedCallback
然后通过生命周期方法向文档添加事件监听器。但是,我似乎无法像我预期的那样真正访问该物业。该属性可通过附加了事件的任何其他元素访问。
下面是一个非常通用的代码笔。单击文档上的任意位置应打开一个弹出窗口,显示该属性的值未定义。但是,如果我单击自定义元素内的按钮,该按钮附加了一个事件,则该事件处理程序能够成功访问该属性。
https://codepen.io/aver-mimas/pen/ExjZXMq
这个例子出了什么问题?
解决方案
在您的代码笔中发生的事情是,当您将成员函数作为参数发送给将存储它并稍后使用它的东西时(事件侦听器将函数存储在内部变量中,并在事件触发时调用它) JS,这个成员函数“松散”了这个this
属性。它与 lit-element 无关,而是在 js 本身上,并且可以在多种情况下发生,但是 lit-element 会创建许多可以变得相关的情况。
您可以使用
document.addEventListener('click', e=>this.handleDocumentClick())
代替
document.addEventListener('click', this.handleDocumentClick)
箭头函数将指示 JS 绑定声明它的对象的“this”,然后使用正确的上下文调用成员函数。
推荐阅读
- django - NoReverseMatch 除非 Url 在主项目 Urls.py
- reactjs - 如何创建一个打开新页面的按钮,并带有返回上一页的选项[ReactJS
- swift - 如何在 NSTabViewController 中禁用延迟加载?
- d3.js - 在 D3 中更改 SVG 对象的颜色
- laravel - Eloquent 无法识别表名
- c++ - 多个项目的基类 (MS Studio)
- php - 我应该缓存所有内容吗
- c++ - 递归函数中的迭代器值变化
- python - python删除除字母以外的数字值
- python-3.x - 使用 postgresql 部署 Flask 应用程序并获取 AttributeError: 'NoneType' object has no attribute 'drivername'