【问题标题】:Find text in webview page using swift?使用swift在webview页面中查找文本?
【发布时间】:2016-11-14 00:55:18
【问题描述】:

如何在 uiwebview 页面中找到文本并将其突出显示并使用 swift 转到其在页面中的位置?

例如 chrome 查找文本:

search example

但我使用的是警报视图:

my search example in my app !!!

【问题讨论】:

    标签: ios iphone swift uiwebview uiwebviewdelegate


    【解决方案1】:

    这里是快速代码:

    1) 将 UIWebViewSearch.js 文件添加到您的项目中

    func highlightAllOccurencesOfString(str:String) -> Int {
    
        let path = Bundle.main.path(forResource: "UIWebViewSearch", ofType: "js")
    
        var jsCode = ""
    
        do{
    
            jsCode = try String(contentsOfFile: path!)
    
        }catch
        {
        // do something
    
        }
    
        self.newsWebView.stringByEvaluatingJavaScript(from: jsCode)
    
        let startSearch = "uiWebview_HighlightAllOccurencesOfString('\(str)')"
    
        self.newsWebView .stringByEvaluatingJavaScript(from: startSearch)
    
        let  result = self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_SearchResultCount")
    
        return  Int(result!)!
    
    
    }
    
    func scrollTo(index:Int)  {
    
        self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_ScrollTo('\(index)')")
    
    }
    
    func removeAllHighlights() {
    
    self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_RemoveAllHighlights()")
    
    } 
    

    【讨论】:

    • 您能否为 Swift 4、WKWebView 更新此解决方案?谢谢!
    【解决方案2】:

    您必须为此使用 JavaScript。
    我用下面的代码做了同样的事情(但在 Objective C 中 - 你可以将它重写为 Swift)。

    用法(仅在 webViewDidFinishLoad - 这很重要!):

    -(void)webViewDidFinishLoad:(UIWebView *)webView {
        if (self.searchString != nil ) {
            [self.webView highlightAllOccurencesOfString:self.searchString];
            int position = self.foundedStringsCount - self.selectedStringNumber - 1;
            [self.webView scrollTo:position];
        }
    }
    

    创建此文件并将其添加到您的代码中:

    SearchWebView.h:

    #import <Foundation/Foundation.h>
    
    @interface SearchWebView : UIWebView
    
    - (NSInteger)highlightAllOccurencesOfString:(NSString*)str;
    - (void)scrollTo:(int)index;
    - (void)removeAllHighlights;
    
    @end
    

    SearchWebView.m:

    #import "SearchWebView.h"
    
    @implementation SearchWebView
    
    - (NSInteger)highlightAllOccurencesOfString:(NSString*)str
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js"];
        NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        [self stringByEvaluatingJavaScriptFromString:jsCode];
    
        NSString *startSearch = [NSString stringWithFormat:@"uiWebview_HighlightAllOccurencesOfString('%@')",str];
        [self stringByEvaluatingJavaScriptFromString:startSearch];
    
        NSString *result = [self stringByEvaluatingJavaScriptFromString:@"uiWebview_SearchResultCount"];
        return [result integerValue];
    }
    
    - (void)scrollTo:(int)index {
        [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"uiWebview_ScrollTo('%d')",index]];
    }
    
    - (void)removeAllHighlights
    {
        [self stringByEvaluatingJavaScriptFromString:@"uiWebview_RemoveAllHighlights()"];
    }
    
    @end
    

    UIWebViewSearch.js:

    var uiWebview_SearchResultCount = 0;
    
    /*!
     @method     uiWebview_HighlightAllOccurencesOfStringForElement
     @abstract   // helper function, recursively searches in elements and their child nodes
     @discussion // helper function, recursively searches in elements and their child nodes
    
     element    - HTML elements
     keyword    - string to search
     */
    
    function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) {
        if (element) {
            if (element.nodeType == 3) {        // Text node
    
                var count = 0;
                var elementTmp = element;
                while (true) {
                    var value = elementTmp.nodeValue;  // Search for keyword in text node
                    var idx = value.toLowerCase().indexOf(keyword);
    
                    if (idx < 0) break;
    
                    count++;
                    elementTmp = document.createTextNode(value.substr(idx+keyword.length));
                }
    
                uiWebview_SearchResultCount += count;
    
                var index = uiWebview_SearchResultCount;
                while (true) {
                    var value = element.nodeValue;  // Search for keyword in text node
                    var idx = value.toLowerCase().indexOf(keyword);
    
                    if (idx < 0) break;             // not found, abort
    
                    //we create a SPAN element for every parts of matched keywords
                    var span = document.createElement("span");
                    var text = document.createTextNode(value.substr(idx,keyword.length));
                    span.appendChild(text);
    
                    span.setAttribute("class","uiWebviewHighlight");
                    span.style.backgroundColor="yellow";
                    span.style.color="black";
    
                    index--;
                    span.setAttribute("id", "SEARCH WORD"+(index));
                    //span.setAttribute("id", "SEARCH WORD"+uiWebview_SearchResultCount);
    
                    //element.parentNode.setAttribute("id", "SEARCH WORD"+uiWebview_SearchResultCount);
    
                    //uiWebview_SearchResultCount++;    // update the counter
    
                    text = document.createTextNode(value.substr(idx+keyword.length));
                    element.deleteData(idx, value.length - idx);
    
                    var next = element.nextSibling;
                    //alert(element.parentNode);
                    element.parentNode.insertBefore(span, next);
                    element.parentNode.insertBefore(text, next);
                    element = text;
                }
    
    
            } else if (element.nodeType == 1) { // Element node
                if (element.style.display != "none" && element.nodeName.toLowerCase() != 'select') {
                    for (var i=element.childNodes.length-1; i>=0; i--) {
                        uiWebview_HighlightAllOccurencesOfStringForElement(element.childNodes[i],keyword);
                    }
                }
            }
        }
    }
    
    // the main entry point to start the search
    function uiWebview_HighlightAllOccurencesOfString(keyword) {
        uiWebview_RemoveAllHighlights();
        uiWebview_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase());
    }
    
    // helper function, recursively removes the highlights in elements and their childs
    function uiWebview_RemoveAllHighlightsForElement(element) {
        if (element) {
            if (element.nodeType == 1) {
                if (element.getAttribute("class") == "uiWebviewHighlight") {
                    var text = element.removeChild(element.firstChild);
                    element.parentNode.insertBefore(text,element);
                    element.parentNode.removeChild(element);
                    return true;
                } else {
                    var normalize = false;
                    for (var i=element.childNodes.length-1; i>=0; i--) {
                        if (uiWebview_RemoveAllHighlightsForElement(element.childNodes[i])) {
                            normalize = true;
                        }
                    }
                    if (normalize) {
                        element.normalize();
                    }
                }
            }
        }
        return false;
    }
    
    // the main entry point to remove the highlights
    function uiWebview_RemoveAllHighlights() {
        uiWebview_SearchResultCount = 0;
        uiWebview_RemoveAllHighlightsForElement(document.body);
    }
    
    function uiWebview_ScrollTo(idx) {
        var scrollTo = document.getElementById("SEARCH WORD" + idx);
        if (scrollTo) scrollTo.scrollIntoView();
    }
    

    【讨论】:

    • 最好在 uiWebview_HighlightAllOccurencesOfString 函数中检查 keyword 参数是否为空或为空,例如这个,uiWebview_RemoveAllHighlights(); if (keyword) { uiWebview_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase()); }
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多