Search to highlight text in PDF using UIWebView

后端 未结 1 738
长情又很酷
长情又很酷 2021-01-14 08:39

I am new in ios developement I have UIWebView for displays Pdf page articles from URL. I need to search string or text and highlight.I am not able to search and highlight th

相关标签:
1条回答
  • 2021-01-14 09:12

    In my case, I have searched text from a page load in web view through text enter in Search bar & my SearchWebView.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
                while (true) {
                    //if (counter < 1) {
                    var value = element.nodeValue;  // Search for keyword in text node
                    var idx = value.toLowerCase().indexOf(keyword);
    
                    if (idx < 0) break;             // not found, abort
    
                    //(value.split);
    
                    //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="purple";
                    span.style.color="white";
    
                    uiWebview_SearchResultCount++;    // update the counter
    
                    text = document.createTextNode(value.substr(idx+keyword.length));
                    element.deleteData(idx, value.length - idx);
                    var next = element.nextSibling;
                    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);
    }
    

    And in my .m I have search any text enter in search bar like:

    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
    {
        [self removeAllHighlights];
        int resultCount = [self highlightAllOccurencesOfString:searchBar.text];
        if (resultCount <= 0)
        {
           alert = [[UIAlertView alloc] initWithTitle:@"No Match Found!"
                                                            message:[NSString stringWithFormat:@"No results found for this: %@", searchBar.text]
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
    
        }
        [searchBar resignFirstResponder];
    }
    

    And my highlightAllOccurencesOfString method is working like:

    - (NSInteger)highlightAllOccurencesOfString:(NSString*)str
    {
    
        NSString *filePath  = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js" inDirectory:@""];
        NSData *fileData    = [NSData dataWithContentsOfFile:filePath];
        NSString *jsString  = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
        [webView stringByEvaluatingJavaScriptFromString:jsString];
        NSString *startSearch   = [NSString stringWithFormat:@"uiWebview_HighlightAllOccurencesOfString('%@')",str];
        [webView stringByEvaluatingJavaScriptFromString:startSearch];
        NSString *result        = [webView stringByEvaluatingJavaScriptFromString:@"uiWebview_SearchResultCount"];
        return [result integerValue];
    }
    

    And my removeAllHighlights method is:

    - (void)removeAllHighlights
    {
        [webView stringByEvaluatingJavaScriptFromString:@"uiWebview_RemoveAllHighlights()"];
    }
    

    Now compare all this with your situation. Hope it helps you. If any doubts then free to ask me.

    0 讨论(0)
提交回复
热议问题