javascript - 当用户按下回车并且元素失去焦点时触发事件
问题描述
每当用户在 contenteditable 字段上按下回车键时,以及当用户失去对元素的关注时,我都想打开一个模式。问题是当用户按下回车键时,两个事件都会被触发(因此打开了两个模式)。我怎样才能找到一个舒适的折衷方案,只允许触发每个事件?
下面的代码:
HTML
<div (blur)="removeLineBreaks($event); openRenameWebsiteModal($event);"
(keydown.enter)="openRenameWebsiteModal($event)"
[attr.contenteditable]="true"
[attr.spellcheck]="false"
*ngIf="websiteLoaded"
id="builder-header-website-name"
blockNonAlphanumericCharacters
class="website-name" ngbPopover="Website Name" triggers="mouseenter:mouseleave">{{ websiteName }}</div>
打字稿
removeLineBreaks(event: any) {
event.preventDefault();
event.stopPropagation();
BuilderService.removeLineBreaks(event);
}
openRenameWebsiteModal(event: any) {
event.preventDefault();
event.stopPropagation();
if (this.websiteName !== event.target.innerHTML) {
const modal = this.modalService.open(BuilderRenameWebsiteModalComponent, {
windowClass: 'modal-holder',
centered: true
});
modal.componentInstance.websiteName = this.websiteName;
modal.componentInstance.newWebsiteName = event.target.innerHTML;
}
}
解决方案
您可以轻松地保留一个全局变量来检查模式当前是否打开。
modal_open = false;
openRenameWebsiteModal(event: any) {
event.preventDefault();
event.stopPropagation();
if (this.websiteName !== event.target.innerHTML && !modal_open) {
modal_open = true;
const modal = this.modalService.open(BuilderRenameWebsiteModalComponent, {
windowClass: 'modal-holder',
centered: true
});
modal.componentInstance.websiteName = this.websiteName;
modal.componentInstance.newWebsiteName = event.target.innerHTML;
}
}
如果这在某些情况下不起作用,您可以使用Observables
推荐阅读
- gallery - 从 android 中具有大小限制的图库中选择视频
- reactjs - 如何在反应中删除滚动功能
- glib - 未定义符号:glib 中的 g_task_set_name
- apache-spark - 从 cassandra 源读取数据时,在 spark 中重新分区会改变 spark 分区的数量吗?
- go - 如何使用 glog 拆分日志文件(github.com/golang/glog)
- android - 在游戏登录时创建 Google play 游戏帐户需要很长时间
- java - SpringBootApp NullPointerException 与 @Autowired 存储库
- css - 如何在 CSS 网格布局中将网格项的 with 设置为随机生成宽度的最小值和 50%?
- python - 在 Python 中编辑文本文件后如何将文本文件重新加载到 JSON 中?
- javascript - [Vue 警告]:渲染错误:“TypeError:无法读取属性 'xxx' of null”