UIWebview 获取选定文本的范围并保存以备后用
Posted
技术标签:
【中文标题】UIWebview 获取选定文本的范围并保存以备后用【英文标题】:UIWebview get range of selected text and save for later use 【发布时间】:2013-10-10 10:35:14 【问题描述】:我使用以下 java 脚本函数从 UIWebView 中获得了选定文本的范围:
function getRangeForSelectedText()
var selection = window.getSelection();
var range = selection.getRangeAt(0);
我必须保存此范围以供以后使用(我想在用户稍后加载文档时使用此范围突出显示文本)。如何在目标 C 中保存 java 脚本对象(范围)?
除了给出范围之外,还有其他方法可以突出显示 UIWebview 中的文本吗?
【问题讨论】:
【参考方案1】:看到那个帖子 http://blog.techno-barje.fr/post/2010/10/06/UIWebView-secrets-part3-How-to-properly-call-ObjectiveC-from-javascript/
还有那个How to call Objective-C from Javascript?
您可以使用脚本向您的 UIWebView 发送一些字符串
function sendURLToUIWebView(url)
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", url);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
您的网址应该有特定的方案 f.e。 myappcomand://
您可以使用UIWebViewDelegate
方法处理它(将某些对象设置为 UIWebView 的委托,例如某些 UIViewController)
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
BOOL shouldLoad = YES;
if ([request.URL.scheme isEqualToString:@"myappcomand"])
shouldLoad = NO;
// parse url string "request.URL" and extract your parameters to store them
return shouldLoad;
你的 javascript 函数
function sendURLToUIWebView(url)
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", url);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
function getRangeForSelectedText()
var selection = window.getSelection();
var range = selection.getRangeAt(0);
var url = "myappcomand://" + "range=" + range; // you should convert range to string
sendURLToUIWebView(url);
更新:
范围到字符串
range.toString().replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '')
或者只是var rangeText = window.getSelection().toString();
见Strange behaviour with range.toString()
【讨论】:
但我的问题是如何将范围对象转换为字符串。范围对象由开始容器、结束容器、开始偏移量、结束偏移量组成。我可以将开始偏移量和结束偏移量转换为字符串,因为它们是整数。但是开始容器和结束容器都是节点对象。 @PriyankaV 当你使用 range.toString() 时你有什么力量? range.toString().replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '') 这是给选定的文本。但我不需要选定的文本 你能从这些变量中转换成字符串吗? var startNode = range.startContainer, endNode = range.endContainer; endNode.length; range.startOffset; 我将 range.startOffset 和 range.endOffset 转换为字符串并作为字符串发送回目标 c: function f() var txt = window.getSelection(); var anchorNodeProp = txt.anchorNode; //获取节点对象返回(txt.anchorOffset + '|' + txt.anchorNode.textContent + '|' + txt.focusOffset + '|' + txt.focusNode.textContent); NSString *rangeObject = [self.webview stringByEvaluatingJavaScriptFromString:@"f()"];但是我可以用那个启动容器对象做什么。【参考方案2】:我遇到了同样的问题。我没有获得选定的范围,而是使用 js 中的以下函数突出显示选定的文本,并在 UIWebView 中获取全文并在 sqlite 中替换它。
JS代码:
function highlight()
if (typeof window.getSelection != "undefined")
var range = window.getSelection().getRangeAt(0);
var selectionContents = range.extractContents();
var span = document.createElement("span");
span.appendChild(selectionContents);
span.setAttribute("class","uiWebviewHighlight");
span.style.backgroundColor = "rgb(237,191,245)";
span.style.color = "black";
range.insertNode(span);
目标 C:
- (void) highlightText
NSString *highlightFunction = [NSString stringWithFormat:@"highlight()"];
[detailedWebView stringByEvaluatingJavaScriptFromString:startSearch];
NSString *highlightedString = [detailedWebView
stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerhtml"];
只需用 highlightString 替换旧的 html 字符串。
【讨论】:
以上是关于UIWebview 获取选定文本的范围并保存以备后用的主要内容,如果未能解决你的问题,请参考以下文章