HTML 内容中的选择可能跨越多个元素。它也可能只包含开始和结束元素内的部分文本。这使得很难为您的问题提供准确的答案,因为在一般情况下,没有一个元素名称或 CSS 样式应用于选择。但是,希望下面提到的构建块将允许您构建与您的意图相匹配的行为。
由于您正在使用 WebKit 的 Objective-C API,我将描述它是如何在 Objective-C API 和 JavaScript 中工作的。由于您使用 JavaScript 无法获得的编译器反馈,因此使用 Objective-C API 会更愉快。
WebView 中的选择表示为DOMRange
并且可以使用 检索-[WebView selectedDOMRange]
。选择从节点文本的-startContainer
偏移量返回的元素开始。-startOffset
选择继续按 DOM 顺序遍历所有节点,-endOffset
直到-endContainer
.
插入点表示为DOMRange
折叠的 a,如collapsed
属性所示。在这种情况下-startContainer
, and-endContainer
应该返回相同的值,指示插入符号所在的节点,-startOffset
并且-endOffset
将相等并表示插入符号所在的文本内容的偏移量。
一旦您确定了所涉及的节点,您就可以使用常规 DOM API 来确定标签名称 ( -[DOMNode tagName]
) 和 CSS 对象模型 API 来检索样式信息 ( -[DOMDocument getComputedStyle:pseudoElement:]
)。
从 JavaScript 方面来看,这些概念是相似的,但是Selection
在您到达Range
s.
您用于window.getSelection()
检索Selection
对象。该对象将包含零个或多个范围,每个范围代表一个选定区域。零范围意味着有一个插入点而不是真正的选择。由于某些平台支持不连续的选择,因此允许多个范围。
如上所述,该Selection
对象将具有一个rangeCount
为零的值和一个isCollapsed
真值,以指示选择只是一个插入点。
当rangeCount
非零时,您可以Selection
通过重复调用来迭代 内的范围getRangeAt
。从那时起,您将返回使用与上述 Objective-C 案例中描述的对象Range
具有相同接口的对象,包括 、和属性。DOMRange
startContainer
endContainer
startOffset
endOffset