[英]How to add new div when hitting enter key in contenteditable div
我正在构建一个 Angular 7 应用程序。 在这个应用程序中,我有一个页面,其 div 将 contenteditable 设置为 true。 当用户按下 Enter 键时,一个新的 div 会添加到编辑器/div 中,紧跟在用户按下 Enter 时聚焦的 div 之后。 不幸的是,此代码(见下文)仅在 div 至少有一个字符时才有效。 这不好,因为我想在 div 中使用假占位符而不是实际字符。
即使 div 为空,我如何更改下面的代码以使其正常工作?
insertBlock($event) {
$event.preventDefault();
const selection = window.getSelection();
const selectedElement = selection.anchorNode.parentNode;
const block = document.createElement('div');
block.innerHTML = 'Type slash for commands';
block.className = 'ce-block';
block.setAttribute('placeholder', 'Type slash for commands');
this.editor.insertBefore(block, selectedElement.nextSibling);
selection.collapse(block.firstChild, block.textContent.length);
}
HTML 看起来像这样(我正在使用指令来监听编辑器事件):
<div class="ce-container" blockeditor [menu]="menu">
<div class="ce-menu" contenteditable="false" #menu>Menu</div>
<div class="ce-block" placeholder="Type slash for commands"></div>
</div>
这个想法是构建一个所谓的块编辑器(例如 Notion.so)。
谢谢!
我已经尝试过了,不确定您是否需要,但请查看StackBlitz 演示
使用Renderer2创建和添加新的 div,并为它们提供一个事件侦听器,该侦听器调用相同的处理程序以从新的 div 添加更多内容。
使用 keyup.enter 作为事件来触发处理程序。
行为:
.ts 中的主要功能是:
onPress(item: HTMLElement) {
//Create div element with contenteditable attrbute. This is the new div
let div = this.renderer.createElement('div');
this.renderer.setAttribute(div, 'contenteditable','');
//Add enter key press listener that calls this same function so gives add functionality to new divs
this.renderer.listen(div, 'keyup.enter', (event) => { this.onPress(event.target) });
//Attaches the new div to the DOM
if (item.nextSibling != null)
{
this.renderer.insertBefore(item.parentElement,div,item.nextSibling);
}
else
{
this.renderer.appendChild(item.parentElement, div);
}
}
html模板:
<div contenteditable (keyup.enter)="onPress($event.target)"></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.