从Cocoa中的WebView获取源HTML

7
我正在为一个OS X程序工作,其中用户在WebView中进行一些轻量级的所见即所得(WYSIWYG)HTML编辑。由于对Cocoa和WebKit编程不熟悉,我完全不知道如何从WebView中获取所选文本 - 目的是获取用户选择的内容,添加HTML代码(如div或span),并用修改后的代码替换所选文本。如何实现这一点?
我目前正在使用MacRuby编写此项目,但也希望得到Objective-C程序员的帮助。谢谢!
3个回答

7

苹果建议使用以下代码片段 来获取 WebKit WebView 的 HTML 内容:

[(DOMHTMLElement *)[[[webView mainFrame] DOMDocument] documentElement] outerHTML];

如果您希望将HTML解释为纯文本,可以使用以下方法:
[(DOMHTMLElement *)[[[webView mainFrame] DOMDocument] documentElement] outerText];

5

UIWebView可以运行任意的JavaScript代码:

[webview stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].innerHTML"]

3
WebView 也是如此。http://developer.apple.com/mac/library/documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/ - Peter Hosey
1
如果你想在WebView中使用JavaScript,最好获取指向WebViewwindowScriptObject属性的指针,该属性返回一个WebScriptObject,您可以使用它来评估JavaScript。 iPhone SDK的UIWebView非常有限,需要使用-stringByEvaluatingJavaScriptFromString:,这更像是一种hack而不是其他任何东西。 Mac OS X上的WebView功能更强大。 - Rob Keniger

3
您可以请求 WebView-selectedDOMRange,您将会得到一个 DOMRange 对象。您可以使用该对象来了解所选内容。DOMRange,像所有 WebKit DOM 对象一样,是标准 W3C DOMRange 对象的 Objective-C 表示形式,请查看 DOMRange.h 以获取它支持的方法/属性。
然后,您可以使用 WebView-replaceSelectionWithMarkupString:-replaceSelectionWithText:-replaceSelectionWithNode: 方法来替换当前选择的内容。

我不想问一个对其他人来说可能很明显答案的问题,但如果我想用< somemarkup> +所选标记+ </ somemarkup>替换标记,我该怎么做?所有这些都让我觉得所选标记将被破坏。 - Jim C
你需要使用传回给你的 DOMRange 对象,并使用它的方法/属性来检查所选内容。HTML 文档不仅仅是一个字符串,DOM 可能已经被动态修改,因此您必须确保用有效的标记替换所选内容。WebKit 定义了 DOMRange 的 -markupString 方法,但不幸的是,这可能无法给您所需的结果。您应该构造一个有效的 DOMNode 结构并插入它,可能使用与从 WebView 接收到的范围不同的范围。 - Rob Keniger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接