【发布时间】:2020-11-06 14:22:08
【问题描述】:
在内容可编辑的 div 中,我想用 <span> 包围选定的文本,或者当我选择其中的所有文本时修改现有的 <span>。我可以做第一个,但不能做第二个。
在第二种情况下,如果我有 A<span>B</span>C 并选择 B,则选择将 anchorNode 显示为 A,将 focusNode 显示为 C,并且 toString() 返回 B。父节点是封闭段落,而不是<span>。我找不到任何方法来区分在A<span>B</span>C 和ABC 中选择B,因为我找不到任何方法来发现在第一种情况下B 周围存在<span> 元素。一定有办法做到这一点,当然?谁能告诉我该怎么做?
代码如下:
var sel = window.getSelection();
var range = sel.getRangeAt(0);
var selected = range.compareBoundaryPoints(range.START_TO_END, range);
if (selected > 0) { // some text is selected
var el = range.commonAncestorContainer;
//
// would expect to find el == <span> if selection is B
// in <p>A<span>B</span>C<p>, but find <p> instead!
//
//... code to surround selection with new span or to process
// existing span... but there is never an existing span!
}
【问题讨论】:
-
您要在什么环境中执行此操作?你有更多代码吗?
-
在上面添加了一些代码。我在做什么:使用 Firefox,双击内容可编辑 div 内段落中的一个单词,添加一个跨度(有效),然后双击同一个单词,尝试修改我刚刚插入的跨度,然后在分配给“el”之后,在浏览器的调试器中放置一个断点。 “el”的值只有当我单击按钮以在插入后立即修改跨度时才显示跨度——如果我单击其他地方,然后返回并再次双击该单词,则无法找到跨度,甚至尽管选择的文本完全在其中。
-
因为没有找到span,所以我最终得到了
ABC
。
标签: html contenteditable