使用Javascript确定文本样式

时间:2013-01-22 04:25:02

标签: javascript html macos cocoa

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

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

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

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

1 个答案:

答案 0 :(得分:1)

HTML内容中的选择可能跨越多个元素。它也可能只包含start和end元素中的部分文本。这使得难以为您的问题提供准确的答案,因为在一般情况下,没有单个元素名称或CSS样式应用于选择。但是,希望下面提到的构建块允许您构建符合您意图的行为。

由于您正在使用WebKit的Objective-C API,我将描述它如何适用于Objective-C API和JavaScript中。由于JavaScript无法获得编译器反馈,因此使用Objective-C API会更加愉快。


WebView中的选择表示为DOMRange,可以使用-[WebView selectedDOMRange]进行检索。选择从-startContainer返回的元素开始,偏移量为-startOffset到节点的文本中。选择将继续通过DOM顺序中的所有节点,直到-endOffset返回的节点中的偏移-endContainer

插入点表示为折叠的DOMRange,如collapsed属性所示。在这种情况下,-startContainer-endContainer应返回指示插入符号所在节点的相同值,-startOffset-endOffset将相等,并表示到的插入点的偏移量插入符号的文本内容。

确定所涉及的节点后,您可以使用常规DOM API来确定标记名称(-[DOMNode tagName])和CSS对象模型API以检索样式信息(-[DOMDocument getComputedStyle:pseudoElement:])。


从JavaScript方面来看,概念是相似的,但在到达Selection之前,Range对象有一个中间步骤。

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

如上所述,Selection对象的rangeCount为零,isCollapsed值为true,表示选择只是一个插入点。

rangeCount非零时,您可以反复调用Selection来迭代getRangeAt中的范围。从那时起,您将重新使用Range个对象,这些对象与上述Objective-C案例中描述的DOMRange对象具有相同的接口,startContainerendContainerstartOffsetendOffset属性。