为了改善这一点,我现在需要检查选择前后的文本,查看标签是否已经打开等。有没有简单的方法来检查选择是否是更大节点的一部分?
(标签是 [in HTML, with <
] 打开的,但你真正的意思是一个元素是否已经开始。区别对于你理解你在这里做什么至关重要。)
因为文档中的一个节点是文档树的一部分,而一个文本节点最多可以是一个非文本节点的子节点,所以每个文本选择都是“更大节点的一部分”。但是,你是否能找出那个节点是什么,是否容易做到,取决于你的能力和浏览器,因为它取决于浏览器的布局引擎使用的 DOM 实现。
例如,在基于 Gecko 的浏览器(如 Firefox)和基于 WebCore 的浏览器(如 Chrome/Google Chrome)中,您可以执行
var selection = window.getSelection();
在选择。然后,selection
您将获得对实现Selection
(Gecko) 或DOMSelection
(WebCore) 接口的对象的引用,该对象具有诸如anchorNode
引用实现Text
接口的对象的属性(请参阅MDN上的 Gecko DOM 参考)。
该对象表示选择开始所在的文本节点,它有一个parentNode
属性可以让您获取元素节点对象,并通过其tagName
ornodeName
属性获取元素类型名称:
var textParent = selection.anchorNode.parentNode;
var textParentType = textParent.nodeName;
的值textParent.parentNode
也可以用来向上遍历文档树的上一层。
anchorNode
当和focusNode
属性引用不同的文本节点对象时,必须格外小心,因为选择通常不仅跨越多个文本节点,而且跨越多个元素。也就是说,在表格中,用户可以轻松选择文本“foobar”,如<td>foo</td><td>bar</td>
.
通过运行时功能测试和异常处理,您可以确定支持哪个接口,而无需求助于容易出错的浏览器嗅探。
例如,如果我要在下面的文本中选择“跳转”并单击,正确的行为是删除strong
它,因为它已经在一个strong
节点中。
您可能需要重新考虑这一点。strong
也许你只是选择了一个不好的例子,但元素中的元素可以有价值strong
;内部元素的 CSS 属性不一定是多余的。另一个例子是强调em
用户可能想要使用该strong
元素的元素中已经存在的文本。
避免使用 jQuery;你不需要它,仔细检查你甚至不会想要它。