1

我目前正在使用可编辑的 WebView,并提供控件以将所选文本更改为<H1>~ <H6>。默认normal样式文本只是<div>
我想知道的,我如何使用 javascript 来检查文本对应的样式类型(H1~H6 或 DIV)...

我目前正在使用以下代码将所选文本的文本样式修改为<H1>

[webView stringByEvaluatingJavaScriptFromString:
                @"document.execCommand(\"FormatBlock\", false, \"<H1>\")"];

有没有办法检查所选文本的样式(无论是通过拖动,还是仅通过光标的位置)正在使用 javascript?

4

1 回答 1

1

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在您到达Ranges.

您用于window.getSelection()检索Selection对象。该对象将包含零个或多个范围,每个范围代表一个选定区域。零范围意味着有一个插入点而不是真正的选择。由于某些平台支持不连续的选择,因此允许多个范围。

如上所述,该Selection对象将具有一个rangeCount为零的值和一个isCollapsed真值,以指示选择只是一个插入点。

rangeCount非零时,您可以Selection通过重复调用来迭代 内的范围getRangeAt。从那时起,您将返回使用与上述 Objective-C 案例中描述的对象Range具有相同接口的对象,包括 、和属性。DOMRangestartContainerendContainerstartOffsetendOffset

于 2013-01-22T05:55:40.897 回答