问题描述
|
我正在制作一个HTML文本编辑器。
为此,我有一个contenteditable设置为true的div。
为了使选定的文本“加粗”,我试图找到选定文本的节点。
我应该怎么做,或者有其他方法可以实现这一点(特别是在ie)。
解决方法
首先,请注意,用户的选择与DOM中的节点没有直接关系。考虑以下HTML片段:
<p>
Now <b>is the time</b> for all <u>good men</u>
to come <i>to the <em>aid</em> of their</i>
country.
</p>
假设用户的选择范围从“时间”的开始到“国家”的结束。至少涉及12个节点:
文本节点的一部分:\“ time \”
<b>
节点的结束标记。
文本节点:\“ for all \”
一个完整的“ 2”节点,带有一个子节点:
文本节点“好人”
文本节点:“来”
完整的“ 3”节点,带有子节点:
文本节点:“到”
完整的“ 4”节点,带有子节点:
文本节点:“帮助”
文本节点:“ \”
文本节点的一部分:\“ country \”(请注意,完整的文本节点包含一个句点,但是选择不包含。)
因此,您实际上不能要求提供nodeName,因为这里有很多节点。
但是,您可以问\“一个容器的nodeName是什么,它完全包围了用户的选择,即使它也可能包含未选择的内容?\”
如果这是您想知道的,则需要TextRange.parentElement()方法(仅对于IE,其他浏览器将使用range.commonAncestorContainer属性)。
例如,在IE中:
window.document.selection.createRange().parentElement().nodeName;
正如您在问题标题中指出的那样,这将使您获得nodeName。这与您想要在问题文本中指出的文本加粗不同。如果要使文本加粗,则可能需要TextRange.execCommand()方法。
window.document.selection.createRange().execCommand(\'Bold\',false);
这应该使选择大胆。存在可能的命令列表。
,这将为您返回nodeName,但是您决定获取选定的文本:
$(\"your-selector-here\").context.nodeName;