【问题标题】:Div content editable insert a new element when pressing enterDiv 内容可编辑按 Enter 键时插入新元素
【发布时间】:2017-09-21 14:36:45
【问题描述】:

对于我的项目,前端用户需要能够将数据发送到我的服务器。 这些数据应该很简单(不允许自定义 html),但问题出在这里,

当客户端按下“enter”按钮时,chrome 会添加一个“div”元素,但是当您将插入符号放在该 div 内的文本之间并再次按下 enter 时,它会创建另一个嵌套在前一个“div”中的“div”。

我想要实现的是,每当客户端按下“输入”时,它都会创建一个“div”(作为新行),如果插入符号位置在文本之间,它会拆分文本并在之后创建一个新的“div”现有的。

例子:

<div contenteditable="true">
    <div class="text">Some text</div>
    <div class="text">Some more text</div>
</div>

所以当我将插入符号放在“更多”和“文本”之间并按 Enter 时,它应该变成这样:

<div contenteditable="true">
    <div class="text">Some text</div>
    <div class="text">Some more</div> <-- caret between "more" & "text"
    <div class="text">text</div> <-- becomes this
</div>

我正在使用 Vue.js,我搜索了大约 5 个小时来寻找具有这种行为的简单前端编辑器,我只找到了 Draft.js,但它是基于 React.js 构建的,我找不到 Vue.js 替代品.

我希望这种行为能够为输入提供一些结构,这样我就可以在服务器端轻松处理数据。

有人可以帮助我实现这一点,或者有人知道 Vue.js 解决方案吗?我不想要一个成熟的 WYSIWYG 编辑器。

【问题讨论】:

  • 你描述的行为是我在 Chrome 中得到的。

标签: javascript html vue.js


【解决方案1】:

您描述的行为是我从 Chrome 中的 contenteditable 中得到的。唯一的问题是,如果您删除所有内容,则需要重置它。这还不是 Vue-ified,但我想看看问题是否定义正确。

const out = document.querySelector('.contents');
const source = document.querySelector('[contenteditable="true"]');
source.addEventListener('input', () => {
  if (source.innerHTML === '') {
    source.innerHTML = '<div class="input-text"><br></div>';
  }
});
setInterval(() => {
  out.textContent = source.innerHTML;
}, 200);
<div contenteditable="true">
    <div class="input-text">Some text</div>
    <div class="input-text">Some more text</div>
</div>
<pre class="contents">
</pre>

【讨论】:

  • 是的类似的东西,但是当你按退格键并输入新的文本行时,它不再包含在
    中。我见过的所有编辑器都专注于 HTML 编辑,而我需要一个专注于前端输入的编辑器,我需要的这种结构允许我清理每个“输入文本 div”中的输入(同时保持允许的标签),比如表情符号等。
  • 对我来说,每个新片段都包含在与其来源相同的标签中。
  • 一直按“退格”,直到所有内容都被删除并重新输入一些文本。基本上我想在按下回车键时为每个新创建的 div 添加一个类“input-text”
猜你喜欢
相关资源
最近更新 更多
热门标签