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 获取选定文本的范围并保存以备后用的主要内容,如果未能解决你的问题,请参考以下文章

从 uiwebview Xcode 中获取选定的文本

获取 UIWebView 的选定文本

检测 UIWebView 文本选择中的文本选择变化

如何在 iPad 应用程序中取消选择选定的文本

显示 UIMenuController 时获取选定的文本

如何在 JavaScript 中获取 textarea 的选定文本范围