【发布时间】:2016-02-29 22:16:12
【问题描述】:
我正在用 Javascript 构建一个简单易用的文本编辑器,基本上是一个所见即所得的编辑器。我将在主包装器 (.wrapper) 中使用 contenteditable 属性。当您在 .wrapper 中按 Enter 键时,带有唯一 id 的新 <p> 元素将附加到包装器中。
我需要一种方法来获取当前选中的 .wrapper 的哪个子元素(即,被聚焦或在其中包含插入符号/文本标记)。
我搜索了几天没有任何结果,我尝试使用document.elementFromPoint(),但没有任何正确的结果。
当使用$(":focus") 时,我得到整个.wrapper 而不是特定的子元素。
编辑:
示例 HTML 结构:
<div class="container t-wrapper" contenteditable>
</div>
示例 Javascript 代码:
$(document).ready(function() {
$currentElement = $("[contenteditable]");
$(".t-wrapper").each(function() {
var id = generateIdentifier(6); // Ignore this
/* This creates the initial <p> child element, where you start typing. */
$(this).html('<p class="t-empty t-first" id="' + id + '"></p>');
$(this).on("mouseup", function() {
/* $currentElement = whatever element the caret is inside. */
});
$(this).on("keyup", function() {
/* $currentElement = whatever element the caret is inside. */
});
));
});
编辑 2:
我设法让它在mouseup 事件中正常工作,因为您实际上是在点击某些东西。但是在使用键盘移动插入符号时,我需要它来工作。或者,我需要一些方法来获取插入符号的位置(以像素为单位),然后使用document.elementFromPoint() 来获取特定元素。
【问题讨论】:
-
您是否尝试过仅在选定节点上使用 contenteditable?例如,您可以将新的
p设置为contenteditable="true",同时对所有其他元素禁用它。导航节点树(单击或箭头键)时,您可以将contenteditable属性移动到下一个元素。这似乎至少使子节点可以使用:focus搜索。 -
一段代码,好吗?
-
@freestock.tk 添加了一些基本示例代码。
-
非常感谢。如果我发现了新的东西,我会告诉你的。
-
@E.Sundin 我尝试了你的建议,但是到处更改
contenteditable只会把事情搞砸
标签: javascript jquery html css contenteditable